2015-11-28 66 views
8

我不知道如何能够在C#中正确解析,但我希望它失败的情况下逗号不分隔每个可重复的三个值。例如:1,123.23应该通过,但在我看来11,23.23应该失败。但实际的输出是tryparse似乎总是返回true,而不管逗号的位置在十进制之前。C#千分隔符问题与decimal.tryparse

编辑︰答案正则表达式被接受,因为它被发现这是一个错误。谢谢。

string price = "1,1,2,3.23"; 
decimal outputValue = 0; 
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands); 


if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("EN-us"), out outputValue)) 
{ 
    Console.WriteLine("Pass"); 
} 
+1

你可能需要核对数量是否与正则表达式正确的格式第一,我不认为有反正用Decimal.TryParse做到这一点 –

+0

@KenTucker我认为允许thousa nd是为此目的而设计的,它应该检查每三个重复的值。这是一个错误还是有任何货币格式接受1,2,3,456和1,23,45?因为它被称为千位分隔符。 – stackdisplay

+0

有一些涉及数千个分隔符和'Parse'(或'Convert'或类似方法)的错误。要100%确定输入格式正确的唯一方法是手动检查。 – varocarbas

回答

3

正如你指出NumberStyles.AllowThousands不强制逗号在正确的地方。所以我觉得一个正则表达式可以帮助你在这里:

Regex.IsMatch("11,23.23", "^[+-]?[0-9]{1,3}(,[0-9]{3})*(.[0-9]*)?$"); 
+1

这并不能解释为什么“1,1,2,3.23”正在通过,并且11,23.23未通过原始示例 –

+0

@ g.pickardou TryParse没有按预期工作,因此我用正则表达式解决方案更新了我的答案。 –

+1

好吧,明白了。顺便说一句,一个简单的替换也会这样做。我认为我们已经接近适合“现在他们有两个问题”的报价:-) –

4

我跑了几个不同的代码,我意识到,当你申请AllowThousands,对地点的唯一约束“”是,它应该是数量的整数部分。

一些结果:

  • “123,,3.12”=>通过
  • “123,3.1,3”=>失败
3

我不知道如果这有助于但是,是的,我想我应该尝试。我认为我的答案是一点点但直截了当,只是如果关注的是格式,我把它比作一个.ToString(“格式指定”);并将其与您的“价格”字符串进行比较。只是我2美分。

string price = "1,1,2,3.23"; 
decimal priceParse = 0; 

if (decimal.TryParse(price, out priceParse)) 
{ 
    string shouldBeFormat = Convert.ToDecimal(priceParse).ToString("#,##0.00"); 

    if (price == shouldBeFormat) 
    { 
     // your good 
    } 
    else 
    { 
     // no good 
    } 
} 
2

你发现的显然是一个错误。我强烈建议不要卡在这里,而是实施一种解决方法。 (也适用KISS)。除非此代码部分在高数学算法的核心或其他任何方式下执行数十亿次是性能至关重要,否则这是一个简单的解决方法。

(假设字符串使用“”(逗号)作为千个分隔符(和他们不是小数分隔符,因为它可能是一些文化)。):

price = price.Replace(",",""); // This will not change the value when comma is thousand separator. 
// Go forward to parsing 
2

你有两个可以接受的格式,所以你可以检查数量是可分析的,如果是这样,检查它是可接受的格式:

string price = "1,123.23"; 
decimal outputValue = 0; 
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands); 
var cul = CultureInfo.GetCultureInfo("EN-us"); 

if (decimal.TryParse(price, allowedStyles, cul, out outputValue)) 
{ 
    if (outputValue.ToString("N", cul) == price || outputValue.ToString("G", cul) == price) 
    { 
     Console.WriteLine("Pass"); 
    } 
} 
+0

嗨问题的真正目的不是接受不同的可接受的格式。如果应用numberstyles.allowthousands,则在输入中输入1,1,23.23将导致程序通过。在我看来,这应该是失败的。 – stackdisplay