-3

我有以下值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)

编辑

显示错误

编辑

显示坐标

编辑 这是数据库中坐标的值

显示 DB 中的坐标值

4

2 回答 2

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. 为所有带有坐标的 DB 条目编写更新脚本 DB,以使用点作为十进制符号。

示例- 此代码给出了您期望的结果:

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
于 2012-05-15T15:10:35.630 回答
-1

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

首先,如果您期望一个十进制值,则将其作为十进制存储在数据库中。

其次,您正在尝试解析一个至少应包含 9 个字符的字符串。你所拥有的只有 5 个字符。

(Coordinate.Substring(4, 5))在这里,您声明您期望至少 9 个字符;你所拥有的只有 5 个字符。

于 2012-05-15T14:35:24.307 回答