Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将公里转换为米?_C#_.net_Math - Fatal编程技术网

C# 如何将公里转换为米?

C# 如何将公里转换为米?,c#,.net,math,C#,.net,Math,我有一些定义“公里”的字符串,例如: sValore = "64.8"; sValore = "64,8"; sValore = "64"; sValore = "64.82323523"; 我需要一个函数把它转换成米 第一个问题是将其转换为“双精度”。我试过: double valore = double.Parse(sValore.Replace(",", ".")); 但事实上,第一个(64.8)的结果是,例如,648(必须是64.8) 然后,做valore*1000我应该可以解决这个

我有一些定义“公里”的字符串,例如:

sValore = "64.8";
sValore = "64,8";
sValore = "64";
sValore = "64.82323523";
我需要一个函数把它转换成米

第一个问题是将其转换为“双精度”。我试过:

double valore = double.Parse(sValore.Replace(",", "."));
但事实上,第一个(64.8)的结果是,例如,648(必须是64.8)

然后,做
valore*1000
我应该可以解决这个问题,但是最后一个案例呢?结果必须是64823,而不是64823.3523


那么,我该如何解决这些问题呢?

我觉得您应该将数据解析为
双精度
十进制
,然后乘以1000。理想情况下,除非确实需要,否则不应将其转换回字符串表示形式。(您甚至可能需要一个明确表示长度和单位的数据结构,以避免以后出现歧义。)


始终尽可能早地将数据转换为最自然的表示形式,然后尽可能长时间地使用该表示形式。

您可以使用
Math.Round()
方法将分数四舍五入到最接近的整数值,或者您可以将该值转换为整数,从而简单地“删除”分数:

double rounded = Math.Round(valore);
double truncated = (int)valore;

您的问题之一似乎是您的数据不正确,其中十进制分隔符使用点或逗号表示。如果您无法在源位置解决该问题,您可以按照已经在做的操作进行替换:

var sValore = "64.82323523";
var kilometers = Decimal.Parse(
  sValore.Replace(",", "."),
  CultureInfo.InvariantCulture
);
请注意,我将
CultureInfo.InvariantCulture
指定为
IFormatProvider
。这将确保使用点作为十进制分隔符。否则,如果当前区域性使用不同的十进制分隔符,代码将中断。(我认为这就是你面临的问题——“valore”是一个意大利语单词,文化中使用逗号,而不是点。)

我还将该值解析为一个
十进制
,因为如果您不想对其执行大量计算,它通常是十进制数的更好类型。如果您愿意,您可以使用
Double

从公里到米只需乘以på1000即可。似乎要将米表示为整数,因此需要对值进行四舍五入并强制转换:

var meters = (Int32) Math.Round(1000*kilometers, 0);

为什么要从字符串中的数值开始?它来自一个数据库,存储在XML中,而不是来自我的系统:)使用类型转换将其转换为整数,或者在“,”和“.”上拆分字符串。因此,您有两个字符串,一个用于整数部分,另一个用于小数部分。然后您可以在一个已知的分隔符上进行连接,该分隔符应该解析correctly@markzzz:部分否决票可能是由于您的问题标题。。。将公里转换为米几乎是一项非常简单的操作。你的问题不是关于单位转换,而是关于字符串操作。也许标题的更改是正确的?第一点仍然是一个问题:double valore=double.Parse(sValore.Replace(“,”,”);返回684,而不是68.4…@markzzz:不要调用
Replace
-使用适合您输入的
IFormatProvider
(例如相关的
CultureInfo
)。如果
64.8
64,8
是同一件事,你是否确定你的输入中永远不会有数千个分隔符,例如“68123”,可能意味着“68000和一点”或“刚刚超过68”。你能举个例子吗?@markzzz:不太清楚,因为我对你的数据了解不够。从根本上说,看起来你的数据不好,如果你没有任何文化参照系,我不知道你想如何处理“68123”,它是不明确的:你觉得怎么样?