【问题标题】:ToDecimal from string not returning expected result字符串中的 ToDecimal 未返回预期结果
【发布时间】:2012-05-23 02:13:38
【问题描述】:

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

编辑

编辑

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

【问题讨论】:

  • 数据库中的字符串是"48.81",实际上不是"48,81"
  • 为什么数据库中的数值是字符串?大多数 dbms 可以存储的不仅仅是字符串 ;-)
  • 请提供一个简短但完整的程序来说明问题。
  • 你没有给我们Coordinate的值。
  • 你能以同样的方式显示databaseCoordinate变量的值吗?

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


【解决方案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

【讨论】:

  • 但是如果数据库中的数据带有,?是将其更改为. 的唯一选择吗?
  • 不,实际上这更像是一种解决方法。正确的解决方案是使用存储该数据时使用的相同文化来解析数据。但我假设您不知道原始文化是什么,并提出了一种可能的解决方法。
  • 数据库用点存储数据,你用逗号接收它们?坐标不是 DB 中的字符串,或者正在进行一些您不知道的中间转换。在第一种情况下,请向我们展示所有相关代码 - 如何从数据库加载值,如何将它们传递给所示方法等。在第二种情况下,用点替换逗号似乎是你唯一的选择。
  • 我一直在调试大部分服务,是的,它与. 一起存储,我收到了,。我在方法中替换了原来的stringdatabaseCoordinate,它与点一起工作......即使对我来说,这个点/逗号更改的原因仍然是一个谜......非常感谢所有时间和答案。
  • 我个人更喜欢指定 DecimalSeparator,而不是更改坐标字符串。 Convert.ToDecimal((Coordinate.Substring(4, 5)), new NumberFormatInfo { NumberDecimalSeparator = "," });
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2010-09-22
    • 2021-05-17
    • 2018-02-19
    • 2018-03-23
    • 2020-03-15
    相关资源
    最近更新 更多