【发布时间】:2016-03-07 09:27:39
【问题描述】:
我在字符串识别方面遇到问题:我试图只识别正确格式的数字,但不知道如何。
我正在编写一种文化不变的方式,因此我需要识别“,”和“。”作为小数和千位分隔符,反之亦然。
所有这些对我来说都是正确的格式:
12,1
12.1
1.000,12
1,000.12
但是这样的事情是错误的
1.2.3
1,2,3
我试过了:
NumberStyles style;
decimal n;
object valore;
style = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowThousands;
Console.WriteLine(decimal.TryParse(valore.ToString(), style , CultureInfo.InvariantCulture, out n));
但是“1,1,1”被读取为有效数字,而“1.1.1”则不是。
如果我使用我的特定文化(“it-IT”),“1,1,1”会被识别,而“1.1.1”则不会。
如何丢弃所有无效字符串?
【问题讨论】:
-
据我所知,您没有在代码中的任何地方使用
style -
这不是小数点分隔符,
NumberGroupSeparator和NumberGroupSizes仅用于输出,小于最大值(默认为 3)是允许的。 -
所有这些对我来说都是正确的格式。不,他们不是。您不知道该值是 1000.12 还是 100012。相差 100 倍从来都不是很微妙。所以这对于其他字符串也会出错,比如 1,1,1。您认为您可以正确执行此操作的假设是不正确的。
-
@gt.guybrush 标准 .NET 格式化和解析基础结构并非旨在处理此类情况。但是无论你是让它按照你想要的那样工作,还是制作你自己的解析器,你仍然会遇到一个问题——歧义。您将如何处理字符串“My numbers are 1,000 1,001 1.000 1.001”(英语)和“Meine Zahlen sind 1,000 1,001 1.000 1.001”(德语)?相同的字符串表示将意味着完全不同的事情,因此几乎不可能做到。一些智能文本分析可能会识别语言/文化,但即使这样也不可靠。
-
允许两种数字格式会引发更大的问题:如果您收到输入字符串“1.024”怎么办?是一千二十四吗?还是一加分数?
标签: c# type-conversion number-formatting tryparse