我有一些定义“公里”的字符串,例如:
sValore = "64.8";
sValore = "64,8";
sValore = "64";
sValore = "64.82323523";
我需要一个将其转换为Meters的功能。
第一个问题是将其转换为“双倍”。我尝试过:
double valore = double.Parse(sValore.Replace(",", "."));
但实际上,first(64.8)的结果是,例如,648(必须是64.8)。
然后,做valore * 1000
我应该解决问题,但最后一个案例呢?结果必须是64823,而不是64823.3523
那么,我该如何解决这些麻烦?
答案 0 :(得分:4)
听起来我应该将数据解析为double
或decimal
,然后再乘以1000.理想情况下,您应该不转换回来除非你真的需要,否则为字符串表示。 (您甚至可能需要一个明确关于长度和单位的数据结构,以避免以后出现歧义。)
尽可能早地尝试将数据放入最自然的表示中,然后尽可能长时间地使用该表示。
答案 1 :(得分:3)
您的一个问题似乎是您的数据不正确,其中小数点分隔符使用点或逗号表示。如果你无法在源头解决这个问题,你可以像现在一样进行替换:
var sValore = "64.82323523";
var kilometers = Decimal.Parse(
sValore.Replace(",", "."),
CultureInfo.InvariantCulture
);
请注意,我将CultureInfo.InvariantCulture
指定为IFormatProvider
。这将确保将点用作小数分隔符。否则,如果当前区域性使用不同的小数分隔符,代码将中断。 (我认为这是你面临的问题 - “valore”是一个意大利语,文化使用逗号,而不是点。)
我还将值解析为Decimal
,因为如果您不想执行大量计算,它通常是十进制数的更好类型。如果您愿意,可以使用Double
代替。
从几公里到几公里只需要乘以1000。您似乎希望将米表示为整数,因此您需要对值进行舍入并将其转换为:
var meters = (Int32) Math.Round(1000*kilometers, 0);
答案 2 :(得分:0)
您可以使用Math.Round()
方法将分数舍入到最接近的整数值,或者您只需将值转换为整数,从而简单地“删除”分数:
double rounded = Math.Round(valore);
double truncated = (int)valore;