C# 在转换为数字类型之前对字符串进行四舍五入
我有一个数字(只是一个例子:C# 在转换为数字类型之前对字符串进行四舍五入,c#,string,C#,String,我有一个数字(只是一个例子: "3616,946489653802082229919075063226" 存储在字符串中。我想将其转换为十进制,但得到一个OverflowException,因为该值对于十进制太长 在转换字符串以修复错误之前,我想对其进行四舍五入 如何执行此操作?解析是特定于区域性的。因此,可以是十进制分隔符或千位分隔符。如果,是千位分隔符,则将忽略它: 这个值超过了decimal.MaxValue,所以抛出了异常 如果,应被视为十进制分隔符,请告知系统: decimal re
"3616,946489653802082229919075063226"
存储在字符串中
。我想将其转换为十进制
,但得到一个OverflowException,因为该值对于十进制太长
在转换字符串以修复错误之前,我想对其进行四舍五入
如何执行此操作?解析是特定于区域性的。因此,
可以是十进制分隔符或千位分隔符。如果,
是千位分隔符,则将忽略它:
这个值超过了decimal.MaxValue,所以抛出了异常
如果,
应被视为十进制分隔符,请告知系统:
decimal result = decimal.Parse(source,
new NumberFormatInfo() { NumberDecimalSeparator = ","});
您将得到
3616.9464896538020822299190751m
您的问题实际上不是一个取整问题,而是试图在一个系统上解析一个带逗号的小数,该系统默认使用点作为小数分隔符
您可以尝试这样做,以确保在所有环境中都能很好地解析它:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
var input = "3616,946489653802082229919075063226";
var result = decimal.Parse(input, new NumberFormatInfo() { NumberDecimalSeparator = ","});
Console.WriteLine(result);
}
}
给定任意数量的小数位数,格式中用逗号分隔单位和小数部分,您可以通过执行以下操作来解决此问题:
class Program
{
static void Main(string[] args)
{
var decimalPlacesCount = 10;
var decimalSeparator = ',';
var parts = "3616,946489653802082229919075063226".Split(decimalSeparator);
var value = decimal.Parse(parts[0]);
if (parts.Length == 2)
{
value += decimal.Parse($"0.{parts[1].Substring(0, decimalPlacesCount)}");
}
Console.WriteLine(value);
}
}
这有效地将其舍入到DecimalPlaceScont中。虽然这不是您的问题,但如果有人偶然发现这个名称很好的问题,正在寻找一个能够将字符串舍入的方法,希望下面的内容会有所帮助
public static string RoundString(string value, int decimalPlaces)
{
StringBuilder returnValue = new StringBuilder(value);
int startIndex = 0;
int charIndex = 0;
while (charIndex < value.Length && startIndex == 0)
{
if (value[charIndex].ToString() == ".")
startIndex = charIndex + 1;
charIndex++;
}
if (int.Parse(value[charIndex + decimalPlaces + 1].ToString()) >= 5)
{
bool rounded = false;
for (charIndex = startIndex + decimalPlaces; charIndex > -1; charIndex--)
{
if (!rounded && charIndex != startIndex-1)
{
int newVal = int.Parse(returnValue[charIndex].ToString()) + 1;
if (newVal > 9)
{
returnValue[charIndex] = '0';
}
else
{
returnValue[charIndex] = (int.Parse(returnValue[charIndex].ToString()) + 1).ToString()[0];
rounded = true;
}
}
}
if (!rounded)
{
startIndex++;
returnValue = new StringBuilder("1" + returnValue.ToString());
}
}
return returnValue.ToString().Substring(0, startIndex + decimalPlaces);
}
公共静态字符串RoundString(字符串值,整数小数点)
{
StringBuilder returnValue=新的StringBuilder(值);
int startIndex=0;
int charIndex=0;
while(charIndex=5)
{
布尔四舍五入=假;
对于(charIndex=startIndex+decimalPlaces;charIndex>-1;charIndex--)
{
如果(!rounded&&charIndex!=startIndex-1)
{
int newVal=int.Parse(返回值[charIndex].ToString())+1;
如果(newVal>9)
{
returnValue[charIndex]=“0”;
}
其他的
{
returnValue[charIndex]=(int.Parse(returnValue[charIndex].ToString())+1.ToString()[0];
四舍五入=真;
}
}
}
如果(!四舍五入)
{
startIndex++;
returnValue=新的StringBuilder(“1”+returnValue.ToString());
}
}
返回returnValue.ToString().Substring(0,startIndex+decimalPlaces);
}
它写得很差,我相信有人可以做得更好,但它确实做得很好。例如,StringBuilder相当劣质,可能会让它运行得更快
另外,我对实际的输入字符串进行0验证。你试过了吗?请提供你的代码。如果你卡住了,它会帮助你,但它不是一个提供代码的服务。你如何转换它?
Decimal.Parse(“3616.946489653802082229919075063226”)
在我的机器上工作,而Decimal.Parse(“361694648965380822299075063226”)
给我一个格式异常
,因为,
被解释为千分位符,但是溢出异常
不在卡片中。我尝试使用Convert.ToDecimal(“…”)转换您的样本
并且它正确地转换了它。我只得到一个溢出异常
,当这个数字对于十进制
来说太大时,十进制结果=decimal.Parse(源代码,new NumberFormatInfo(){NumberDecimalSeparator=“,”);
@NicoSchreiner你的应用程序中可能有不同的区域设置吗?
public static string RoundString(string value, int decimalPlaces)
{
StringBuilder returnValue = new StringBuilder(value);
int startIndex = 0;
int charIndex = 0;
while (charIndex < value.Length && startIndex == 0)
{
if (value[charIndex].ToString() == ".")
startIndex = charIndex + 1;
charIndex++;
}
if (int.Parse(value[charIndex + decimalPlaces + 1].ToString()) >= 5)
{
bool rounded = false;
for (charIndex = startIndex + decimalPlaces; charIndex > -1; charIndex--)
{
if (!rounded && charIndex != startIndex-1)
{
int newVal = int.Parse(returnValue[charIndex].ToString()) + 1;
if (newVal > 9)
{
returnValue[charIndex] = '0';
}
else
{
returnValue[charIndex] = (int.Parse(returnValue[charIndex].ToString()) + 1).ToString()[0];
rounded = true;
}
}
}
if (!rounded)
{
startIndex++;
returnValue = new StringBuilder("1" + returnValue.ToString());
}
}
return returnValue.ToString().Substring(0, startIndex + decimalPlaces);
}