与decimal.tryparse的C#千位分隔符问题

时间:2015-11-28 13:26:33

标签: c#

我不确定这是如何在C#中正确解析的,但我希望它失败的地方是逗号没有分隔每个可重复的三个值。示例:1,123.23应该通过,但11,23.23应该在我看来失败。但实际输出是tryparse似乎总是返回true,无论逗号的位置在十进制之前的位置。

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

 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");
 }

5 个答案:

答案 0 :(得分:3)

正如您所指出的,NumberStyles.AllowThousands并不强制逗号位于正确的位置。所以我认为正则表达式可以帮助你:

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

答案 1 :(得分: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 :(得分:2)

你发现的很明显是一个错误。我强烈建议不要卡在这里,而是实施一个解决方法。 (并且还申请KISS)。

除非这个代码部分以高数学算法的核心或任何其他方式执行数万亿次,否则性能至关重要,这是一个简单的解决方法。

(假设字符串使用','(逗号)作为千位分隔符。(并且它们不是小数分隔符,因为它可能是一些文化)):

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

答案 3 :(得分: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");
    }
}

答案 4 :(得分:1)

我运行了几个不同的代码,我意识到当你申请AllowThousands时,唯一的限制就是','是它应该在数字的整数部分。

一些结果:

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