c#格式化数据到具有变量小数位的数据库

时间:2016-09-25 10:05:21

标签: c#

我需要一个函数来检索格式良好的插入数据库的价格。数据库只接受点作为小数分隔符,不能有千位分隔符。

1,000.25 -> is not valid
1000.25  -> is valid
1000,25  -> is valid (but will be converted ',' to '.')

但是并不总是列有2个小数位,有些列可以有5个小数位。

public static double MoneyToDatabase(string value, int decimal_places)
{
    if(string.IsNullOrEmpty(value) == true)
        return 0.00;

    value = value.Replace(",", "."); // converts the comma into dot

    string cardinal = "##";

    if(decimal_places > 2)
        for(int i = 3; i <= decimal_places; i++)
            cardinal += "#";

    return Convert.ToDouble(string.Format("{0:0." + cardinal + "}", value));
}

我面临的问题和疑问:

  1. 有没有办法(在Linq或其他东西) - 除了循环 - 添加剩余的#?
  2. MoneyToDatabase("15,00", 2)返回1500,应返回15.00
  3. MoneyToDatabase("15,00", 5)返回1500,应返回15.00000
  4. 我不清楚'0:'的含义是什么

2 个答案:

答案 0 :(得分:0)

你可以使用如下转换器:

float.Parse("1,000.25", NumberStyles.AllowThousands);
float.Parse("1000.25", NumberStyles.AllowThousands);
1000,25  you can replace it ;).

请注意,如果您使用不同的文化,请使用不变的文化。

答案 1 :(得分:0)

<强>解决

实际问题是CultureInfo,我发现我可以使用“F2”,“F3”,这将检索我想要的小数位。

public static string MoneyToDatabase(string value, int decimal_places)
{
    if(string.IsNullOrEmpty(value) == true)
        return "0.00";

    value = value.Replace(",", ".");

    string format = "F" + decimal_places;

    double valueAsDouble;
    double.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out valueAsDouble);

    // It sets again a comma in the string and must be replaced
    return valueAsDouble.ToString(format).Replace(",", ".");
}