在德语中,逗号作为小数点,而句点用于分隔千位。
因此:
- 1.000 等同于 1000 - 1,000 等同于 1 - 1.000,89 等同于 1000.89 - 1.000.123.456,89 等同于 1000123456.89
真正的技巧,似乎在于确保可以有多个点,后面可能跟着逗号分隔符。
我会使用以下正则表达式:
^-?\d{1,3}(?:\.\d{3})*(?:,\d+)?$
这是一个代码示例,将它解释为有效的浮点数(注意字符串替换后的parseFloat()
)。
编辑:正如Severin Klug的回答中所提到的,下面的代码假定数字已知为德国格式。尝试“检测”字符串是否包含德国格式或美国格式数字是不确定的,超出了此问题的范围。'1.234'
在两种格式中都是有效的,但实际值不同,没有上下文无法确定意味着哪种格式。
var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89'];
document.getElementById('out').value=numbers.map(function(str) {
return parseFloat(str.replace(/\./g, '').replace(',', '.'));
}).join('\n');
<textarea id="out" rows="10" style="width:100%"></textarea>
我本想将这个内容作为评论发布,但是由于我的声望不够,无法进行评论。 @funkwurm, 你的帖子https://dev59.com/RIfca4cB1Zd3GeqPk5vG#28361329包含了JavaScript代码。
var numbers = ['1.000', '1,000', '1.000,89', '1.000.123.456,89', '1.2'];
numbers.map(function(str) {
return parseFloat(str.replace(/\./g, '').replace(',', '.'));
}).join('\n');
这段代码的功能是将德语数字转换为英文/国际数字。对于在德国千分点后恰好有三位数字的每个数字,它都能成功执行转换,就像你在示例数组中使用的数字一样。但是,这里存在一个关键的用例错误:它也会删除任何其他具有不到三个数字的点的字符串。
因此,如果插入类似“1.2”的字符串,它返回的结果是12;如果插入“1.23”,则返回的结果是123。
这是一个非常关键的行为,如果有人只是简单地采用上述代码片段,并认为它可以将任何给定数字正确转换为英文数字,那么已经正确的英文数字将被损坏!所以请小心使用。
([0-9]{1,3}(?:\.[0-9]{3})*(?:\,[0-9]+)?)
Regex regex = new Regex("-?\d{1,3}(?:\.\d{3})*(?:,\d+)?");
Match match = regex.Match(input);
Decimal result = Decimal.Zero;
if (match.Success)
result = Decimal.Parse(match.Value, new CultureInfo("de-DE"));
试试这个,它会匹配你的输入:
^(\d+\.)*\d+(,\d+)?
这个正则表达式适用于正数
/^[0-9]{0,3}(\.[0-9]{3})*(,[0-9]{0,2})?$/
细分
[0-9]{0,3}
- 此部分允许零到三个数字。空值有效,'1'、'26'、'789' 都是有效的。'1589' 无效。
(\.[0-9]{3})*
- 此部分允许零个或多个点... 如果有一个点,则必须在点后面有三个数字。'2.589' 是有效的。'2.5896' 和 '2.45' 无效。
(,[0-9]{0,2})?
- 此部分允许零个或一个逗号。逗号后可以有零到两个数字。'25,'、'25,5'、'25,45' 都是有效的。'25,456' 和 '25,45,8' 无效。
希望这对您有所帮助