Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用角+材料支持IE 11中输入type=“数字”中的',‘

使用角+材料支持IE 11中输入type=“数字”中的',‘
EN

Stack Overflow用户
提问于 2019-03-16 00:19:29
回答 1查看 3.4K关注 0票数 1

我需要接受10,12作为一个有效的数字在IE 11,因为用户只有一个德国数字垫作为输入设备,只有一个逗号作为小数分隔符。

当前行为为(使用用户输入->值)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10,12 -> 10

想要的行为是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
10,12 -> 10.12
10.12 -> 10.12

就像它目前在Chrome上一样。

我目前的想法是为输入的ControlValueAccessor实现一个type=“文本”,它将值解析为一个数字,但我的尝试失败了。

输入必须与reactiveForms一起工作,并且必须是一个数值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-16 01:45:45

我遇到了同样的问题,即使在将语言设置为不同的区域并使用小于1的步骤时,我也无法获得一个逗号作为带有<input type="number">的十进制分隔符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="number" step="0.01" lang="en-US">

因此,我选择了一种基于<input type="text">的定制解决方案,它具有自定义过滤机制,只允许数字进入。 有关完整的演示,请参见这一堆闪电战

最重要的部分是过滤用户在字段中输入的内容。我建议您编写一个指令,侦听输入/键下/粘贴事件,并使用regex只允许浮点数/整数。

下面的regex (/^-?\d*(,|\.)?\d*$/)允许一个数字以可选的-开头,后面跟着数字,然后是逗号或点以及更多的数字。

如果新值(当前值+按下的键)与正则表达式不匹配,只需防止事件在event.preventDefault()中发生。否则,什么也不做,让值转到输入。

请注意,您还必须处理复制/剪切/粘贴/撤消/重做特殊键。还考虑到光标的位置和选择(如果有的话)。

过滤完成后,您可以实现ControlValueAccessor接口,并通过其change/input事件将其绑定到输入。在这些处理程序中执行字符串到数字转换,并在绑定到value属性的getter或管道中执行从数字到字符串的转换。

下面是这样一个指令的示例,您可以通过将regex作为输入参数来概括它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Directive, Input, HostListener, forwardRef } from '@angular/core';

@Directive({
  selector: '[appNumberOnly]'
})
export class NumberOnlyDirective {
  @HostListener('keydown', ['$event'])
  public onKeydown(event: KeyboardEvent): void {
    const { key } = event;
    if (this.isSpecialOperation(event) || !this.isKeyPrintable(event)) {
      return;
    }
    const newValue = this.getNewValue(event.target as HTMLInputElement, key);
    if (!this.valueIsValid(newValue)) {
      event.preventDefault();
    }
  }

  @HostListener('paste', ['$event'])
  public onPaste(event: ClipboardEvent): void {
    const pastedText = event.clipboardData.getData('text');
    const newValue = this.getNewValue(event.target as HTMLInputElement, pastedText);
    if (!this.valueIsValid(newValue)) {
      event.preventDefault();
    }
  }

  private getNewValue(target: HTMLInputElement, str: string): string {
    const { value = '', selectionStart, selectionEnd } = target;
    return [
        ...value.split('').splice(0, selectionStart),
        str,
        ...value.split('').splice(selectionEnd)].join('');
  }

  private valueIsValid(value: string): boolean {
    return /^-?\d*(,|\.)?\d*$/.test(value);
  }

  private isSpecialOperation(event: KeyboardEvent): boolean {
    const { keyCode, ctrlKey, metaKey } = event;
    // allow ctr-A/C/V/X/Y/Z
    const keysACVXYZ = [65, 67, 86, 88, 89, 90];
    if ((ctrlKey || metaKey) && keysACVXYZ.indexOf(keyCode) >= 0) {
      return true;
    }
    return false;
  }

  private isKeyPrintable(event: KeyboardEvent): boolean {
    const { keyCode } = event;
    return (
      (keyCode > 47 && keyCode < 58)      || // number keys
      keyCode === 32 || keyCode === 13    || // spacebar & return key(s)
      (keyCode > 64 && keyCode < 91)      || // letter keys
      (keyCode > 95 && keyCode < 112)     || // numpad keys
      (keyCode > 185 && keyCode < 193)    || // ;=,-./` (in order)
      (keyCode > 218 && keyCode < 223));      // [\]' (in order)
  }
}

以及实现ControlValueAccessor的自定义输入号组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { Component, ViewChild, forwardRef, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';

@Component({
  selector: 'app-input-number',
  template: `
    <input
      type="text"
      #input
      appNumberOnly
      [placeholder]="placeholder"
      [value]="_stringifiedValue"
      (input)="_onInput($event.target.value)"
      (change)="_onChange($event.target.value)"
      (blur)="input.value = _stringifiedValue">
  `,
  styles: [`
    :host { width: 100%; display: block; }
    input { width: 100%; }
  `],
  providers: [
    {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => InputNumberComponent),
      multi: true
    }
  ]
})
export class InputNumberComponent implements ControlValueAccessor {
  private onChange = [(_: number) => {}];
  private onTouch = [() => {}];

  @Input() placeholder;

  @ViewChild('input') _input: ElementRef;

  @Input()
  get value(): number {
    return this._value;
  }
  set value(value: number) {
    const safeValue = this.safeValue(value);
    if (safeValue !== this._value) {
      this._value = safeValue;
      this.onChange.forEach(fn => fn(safeValue));
    }
  }
  private _value: number = undefined;

  @Output() valueChange = new EventEmitter<number>();

  get _stringifiedValue(): string {
    const val = (this._input.nativeElement.value || '').replace('.', ',');
    if (val === '-' || val === ',') return val;
    const safeValue = this.safeValue(this.value);
    return this.stringify(safeValue).replace('.', ',');
  }

  _onInput(value: string): void {
    this.value = this.safeValue(value);
  }

  _onChange(value: string): void {
    this.value = this.safeValue(value);
    this.valueChange.emit(this.value);
  }

  private safeValue(val: string | number): number {
    const safeValue = parseFloat(this.stringify(val).replace(',', '.'));
    return isNaN(safeValue) ? undefined : safeValue;
  }

  private stringify(val: string | number): string {
    return val === undefined || val === null ? '' : `${val}`;
  }

  public registerOnChange(fn: any): void {
    this.onChange.push(fn);
  }

  public registerOnTouched(fn: any): void {
    this.onTouch.push(fn);
  }

  public writeValue(inputValue: number): void {
    this.value = this.safeValue(inputValue);
  }
}

然后,该组件可以与[(ngModel)][(value)]进行双向绑定。它也适用于反应形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<app-input-number [(ngModel)]="value"></app-input-number>
<app-input-number [(value)]="value"></app-input-number>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55194822

复制
相关文章
sql server 字符串转日期_sql server 字符串替换
提示:这里对文章进行总结: 例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
全栈程序员站长
2022/11/09
1.6K0
sql server 字符串替换函数REPLACE
sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母字符 参数2、3:参数1中含有的参数2替换成参数3 update basis_ware set NAME=REPLACE(参数1,参数2,参数3)
乔达摩@嘿
2020/09/11
1.6K0
SQL数据库替换字符串
由于Typecho系统的插件并没有多完整,所以常常会用到数据库替换字符串这个函数功能,最近替换都是先查找方法再执行,甚是麻烦。于是在这里备份一下,方便下次使用。
浩瀚博客
2022/03/23
1.1K0
大型数据集的MySQL优化
诸多知名大公司都在使用MySQL,其中包括Google、Yahoo、NASA和Walmart。此外,其中部分公司的表囊括数十亿行,却又性能极佳。虽然很难保持MySQL数据库高速运行,但面对数据堆积,可以通过一些性能调整,来使其继续工作。本文则将围绕这一问题展开讨论。 导论 设计数据库之前,有必要先了解一下表的使用方法。例如,对于需要频繁更新的数据,最好将其存入一个独立表中,而通过这样的分表,更新操作将更加快捷。同时,表的连接操作也会消耗时间,所以若要深入分析复杂数据,则最好选用大表。惯有认知下,归一化可通过
CSDN技术头条
2018/02/12
1.2K0
CentOS上安装SQL Server
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2012 的大型多处理器的服务器等多种平台使用。,下面为大家分享一下CentOS上安装SQL Server具体步骤。
会长君
2023/04/26
1K0
Docker 上运行 SQL Server
SQL Server 真是越来越有看头。当我们还在为 Linux 上运行 SQL Server 而兴奋的时候,SQL Server 已经开启了 容器化之路,至此才能看清微软的胸怀,开始拥抱更大的世界。当我越来越深入去阅读有关 Docker 容器的文档,已然发现曾经部署上千台 Linux MySQL 的场景,如今在 Docker 的帮助下,SQL Server 也是手到擒来。如果 SQL Server 再匹配一个分布式计算引擎,那也是分分钟即可打造一个计算怪兽,和小象 Hadoop 分庭抗礼。届时玩 SQL 的朋友们不用分心去折腾 Hadoop/Spark, 仅用 T-SQL 依然可以笑傲江湖。因为人工智能,机器学习算法本就是数据集合操作,天生和 SQL 结合紧密。不信看我的这篇:
Lenis
2019/12/26
1.9K0
云上SQL Server 内存管理
前言:众所周知,cpu,内存,磁盘是一个服务非常重要的三个核心资源,本章将介绍SQL Server 内部的内存结构和内存管理。最后给出内存在腾讯云SQL Server云数据库监控指标中的反应,帮助用户了解SQL Server云数据库的特性。
goslingwang
2021/07/26
2.3K0
管理sql server表数据_sql server如何使用
表是SQL Server中最基本的数据库对象,用于存储数据的一种逻辑结构,由行和列组成, 它又称为二维表。 例如,在学生成绩管理系统中,表1–是一个学生表(student)。
全栈程序员站长
2022/09/23
1.8K0
管理sql server表数据_sql server如何使用
Oracle 数据库sql语句查看字符集,PG数据库查询字符集方法
【Oracle 数据库查询字符集】 查询出 NLS_NCHAR_CHARACTERSET 参数的值即是数据库的字符集。
小蓝枣
2021/12/01
1.6K0
Oracle 数据库sql语句查看字符集,PG数据库查询字符集方法
Oracle 查看数据库字符集和客户端字符集 SQL 语句
很多刚接触的朋友经常会搞混这两个字符集,数据库字符集是在创建数据库时进行指定的,不建议更改!而客户端字符集是可以随时更改的!
Lucifer三思而后行
2021/09/14
5.3K0
SQL Server字符串左匹配
在SQL Server中经常会用到模糊匹配字符串的情况,最简单的办法就是使用like关键字(like语法http://msdn.microsoft.com/en-us/library/ms179859.aspx)。但是如果我们使用的前后都加%的方式,是没办法用到索引进行快速查询的,所以很多情况下我们使用左匹配的方式。最常见的一个例子就是在搜索框中,用户输入了一部分关键字,系统可以通过用户的输入进行左匹配,找出相关的结果列出来。使用左匹配的好处是可以使用到SQL Server中对该字段建立的索引,使得查询效率很高,但是不好的SQL语句仍然会导致索引无法使用。
深蓝studyzy
2022/06/16
9480
SQL Server 数据恢复
--创建测试数据库 CREATE DATABASE Db GO --对数据库进行备份 BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT GO --创建测试表 CREATE TABLE Db.dbo.TB_test(ID int) --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败) WAITFOR DELAY '00:00:01' GO --假设我们现在误操作删除了 Db.dbo.TB_test 这个表 DROP TABLE Db.dbo.TB_test --保存删除表的时间 SELECT dt=GETDATE() INTO # GO --在删除操作后,发现不应该删除表 Db.dbo.TB_test --下面演示了如何恢复这个误删除的表 Db.dbo.TB_test --首先,备份事务日志(使用事务日志才能还原到指定的时间点) BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT GO --接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行) RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY GO --将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早 DECLARE @dt datetime SELECT @dt=DATEADD(ms,-20,dt) FROM # --获取比表被删除的时间略早的时间 RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt GO --查询一下,看表是否恢复 SELECT * FROM Db.dbo.TB_test /*--结果: ID ----------- (所影响的行数为 0 行) --*/ --测试成功 GO --最后删除我们做的测试环境 DROP DATABASE Db DROP TABLE #
_一级菜鸟
2020/08/02
1.3K0
SQL Server 连接字符串总结
使用服务器名\实例名作为连接指定SQL Server实例的数据源。如果你使用的是SQL Server 2008 Express版,实例名为SQLEXPRESS。
Vincent-yuan
2019/09/29
3.1K0
SQL SERVER的数据类型
    数据类弄是数据的一种属性,表示数据所表示信息的类型。任何一种计算机语言都定义了自己的数据类型。当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同。SQLServer 提供了 25 种数据类型:   ·Binary [(n)]   ·Varbinary [(n)]   ·Char [(n)]   ·Varchar[(n)]   ·Nchar[(n)]   ·Nvarchar[(n)]   ·Datetime   ·Smalldatetime   ·Decimal[(p[,s])]   ·Numeric[(p[,s])]   ·Float[(n)]   ·Real   ·Int   ·Smallint   ·Tinyint   ·Money   ·Smallmoney   ·Bit   ·Cursor   ·Sysname   ·Timestamp   ·Uniqueidentifier   ·Text   ·Image   ·Ntext
Tony老师
2020/03/05
1.6K0
SQL Server 深入解析索引存储(上)
概述 最近要分享一个课件就重新把这块知识整理了一遍出来,篇幅有点长,想要理解的透彻还是要上机实践。 聚集索引 --创建测试数据库 CREATE DATABASE Ixdata GO USE [Ixdata] GO ---创建测试表 CREATE TABLE Orders (ID INT PRIMARY KEY IDENTITY(1,1), NAME CHAR(80)NOT NULL, IDATE DATETIME NOT NULL DEFAULT(GETDATE()) ); GO ---插入1000条测试
逸鹏
2018/04/11
1K0
SQL Server 深入解析索引存储(上)
字符处理——字符替换
字符替换在Excel使用过程中应该比较常用,比如清除不可见字符、替换某些特殊字符等。
xyj
2020/07/28
1.7K0
字符处理——字符替换
SQL Server 数据类型
? ? ? ?
小手冰凉
2019/09/10
5740
SQL Server 数据类型
SQL Server 与 MySQL 中排序规则与字符集相关知识的一点总结
字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码。排序规则则是在特定字符集的基础上特定的字符排序方式,排序规则是基于字符集的,是对字符集在排序方式维度上的一个划分。
IT派
2018/08/10
1.2K0
SQL Server 与 MySQL 中排序规则与字符集相关知识的一点总结
SQL SERVER拼接字符串(字符串中有变量)
  3、若在执行时存在类型转换错误,则应用相应的类型转换函数,对变量进行类型转换(如cast()函数)。
全栈程序员站长
2022/07/05
2.3K0
SQL SERVER拼接字符串(字符串中有变量)
sql server 字符串和日期的转换函数[通俗易懂]
字符串转换为日期: cast(‘20100514’ as datetime)
全栈程序员站长
2022/11/10
2.6K0

相似问题

CTE表优化

11

优化CTE查询

12

用CTE语句创建表

11

优化CTE查询

120

如何优化时态SQL Server表的性能

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文