Javascript 角度应用程序中与区域设置相关的regexp(小数点或彗差)
我有一个Angular 2+素数应用程序,它将regexp用于浮点数字:Javascript 角度应用程序中与区域设置相关的regexp(小数点或彗差),javascript,angular,primeng,Javascript,Angular,Primeng,我有一个Angular 2+素数应用程序,它将regexp用于浮点数字: <input pInputText pattern="[0-9]*\.[0-9]" [(ngModel)]="someModel"/> 它适用于美国地区,但是一些国家使用coma表示小数,因此该模式不适合他们 目前,我正在考虑在组件代码中检索分隔符,并在其中动态构造regexp Q:如何处理依赖于区域设置的regexp,最好的/规范的方法是什么 注意:我只需要在Chrome中使用它,并且只需要考虑浏览器区
<input pInputText pattern="[0-9]*\.[0-9]" [(ngModel)]="someModel"/>
它适用于美国地区,但是一些国家使用coma表示小数,因此该模式不适合他们
目前,我正在考虑在组件代码中检索分隔符,并在其中动态构造regexp
Q:如何处理依赖于区域设置的regexp,最好的/规范的方法是什么
注意:我只需要在Chrome中使用它,并且只需要考虑浏览器区域设置。我正在使用
浏览器区域设置1.0.2
进行输出。此正则表达式将使用逗号或点匹配字符串
[0-9]*'[\.,][0-9]
如果要根据用户定义的区域设置匹配点或逗号,请使用[0-9]*'[\.][0-9]
匹配点,使用[0-9]*'[,][0-9]
匹配逗号
编辑
我发现:
<label for="regex">Set a pattern (regex string): </label>
<input type="text" ng-model="regex" id="regex" />
<label for="input">This input is restricted by the current pattern: </label>
<input type="text" ng-model="model" id="input" name="input" ng-pattern="regex" /><br>
设置模式(正则表达式字符串):
此输入受当前模式的限制:
有了它,您可以根据您在
#regex
中的语言环境定义regex,并将其用于其他200个输入。通过这种方式,您只需定义一次。对于任何在本文中遇到障碍的人,这里是我的解决方案:
您可以通过注入locale\u ID来获取区域设置。
基于此,您可以使用
getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string
从@angular/common()
利用这一点,我创建了一个本地化模式的服务。模式存储在enum ValidationExpression中
服务:
import { getLocaleNumberSymbol, NumberSymbol } from "@angular/common";
import { Inject, Injectable, LOCALE_ID } from "@angular/core";
import { ValidationExpression } from "./validation-expression.enum";
...
constructor(@Inject(LOCALE_ID) private _locale: string) {
}
public getLocalizedPattern(expression: ValidationExpression): string {
const separator = getLocaleNumberSymbol(this._locale, NumberSymbol.Decimal);
return expression.replace("delimiter", "\\" + separator);
}
模式枚举:
export enum ValidationExpression {
decimal = "^(\\-|\\+)?([0-9]+((delimiter)[0-9]+)?)$",
decimalPos = "^[+]?([1-9][0-9]*(?:[delimiter][0-9]*)?|0*[delimiter]0*[1-9][0-9]*)$",
decimalPosWithZero = "^(\\+)?([0-9]+((delimiter)[0-9]+)?)$",
int = "^(\\-|\\+)?[0-9]+$",
intPos = "^\\+?[1-9]\\d*$",
intPosWithZero = "^\\+?[0-9]\\d*$"
}
请注意,我的模式不包括千位分隔符(1234.56)我不确定您想要什么。它是用来匹配带点和昏迷的字符串的吗?或者根据当前定义的区域设置匹配点或逗号?是的,我需要根据区域设置匹配点或逗号,很明显,我必须根据区域设置使用不同的模式。但问题是如何做到这一点?请看我的编辑,这可能不是最好的解决方案,但它可以引导您使用iTunes,但这不是一个选项。我需要通用的解决方案,这一个需要
开关
和200个选项:)谷歌搜索一下,看看我的新编辑(手指交叉)我面临这个问题,你的解决方案不好,因为美国人使用点和逗号(比如192.397,22)。这意味着您提供的正则表达式无法处理该问题。您也可以使用浏览器区域设置