字符串中的ToDecimal未返回预期结果

时间:2012-05-15 14:26:24

标签: c# vb.net type-conversion cultureinfo

我有以下值48.81,它来自数据库的字符串,我需要将其转换为十进制,我正在使用:

Dim Seconds As Decimal = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture)

我收到了4881D,我需要48,81

有什么想法吗?我以为CultureInfo.InvariantCulture会帮助我

修改

坐标值为675900.244。 我像这样“分裂”它:

Dim Degress As Integer = Coordinate.Substring(0, 2),
Dim Minutes As Integer = Coordinate.Substring(2, 2),
Dim Seconds As Decimal = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture),
Dim Position As Enumerations.EnumCoordinatesPosition = Coordinate.Substring(9, 1)

修改

Showing the error

修改

Showing the coordinate

修改 这是数据库中坐标的值

Showing the value of the coordinate in the DB

2 个答案:

答案 0 :(得分:1)

问题在于变量databaseCoordinate,它包含逗号而不是点。 InvariantCulture使用逗号分隔数字组和点作为小数符号。要查看此内容,请执行以下代码:

//outputs '.'
Console.WriteLine(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);
//outputs ',' 
Console.WriteLine(CultureInfo.InvariantCulture.NumberFormat.NumberGroupSeparator); 

你能做些什么:

  1. 在解析之前用逗号替换逗号 - 所有代码都将按预期工作。
  2. Convert.ToDecimal方法指定小数分隔符,如下所示:

    decimal Seconds = Convert.ToDecimal((Coordinate.Substring(4, 5)), new NumberFormatInfo { NumberDecimalSeparator = "," });
    
  3. 为所有数据库条目写入更新脚本数据库,其坐标使用点作为小数符号。

  4. 示例 - 此代码提供您期望的结果:

    string Coordinate = "100948.811"; //Note the dot instead of comma
    int Degress = Convert.ToInt32(Coordinate.Substring(0, 2)); //10
    int Minutes = Convert.ToInt32(Coordinate.Substring(2, 2)); //9
    decimal Seconds = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture); //48.81
    

答案 1 :(得分:-1)

从数据库收到的值存在问题;而且你的方法也有问题。

首先,如果您需要十进制值,则将其作为十进制值存储在数据库中。

其次,你试图解析一个至少有9个字符的字符串。你所拥有的只有5个字符。

(Coordinate.Substring(4, 5))在这里你宣称你期待至少9个字符;你拥有的只有5个字符。