如何将十进制(0.5的倍数)字符串格式设置为整数或混合数
本文关键字:格式 字符串 设置 混合 整数 十进制 | 更新日期: 2023-09-27 18:27:38
如何将十进制(总是0.5的倍数)格式化为整数或混合数。
示例:
0.00 .... "" or "0"
0.50 .... "1/2"
1.00 .... "1"
1.50 .... "1 1/2"
等等。
编辑:
这可能就是我想要的。但我还没试过。我想这类事情有一个Regex。
public static string ToMixedNumber(this decimal d)
{
if (d == null || d == 0) return "";
var s = d.ToString().TrimEnd('0');
if(s.EndsWith(".")) return s.TrimEnd('.');
return s.TrimEnd('.') + " 1/2";
}
您不能使用默认的格式化程序。您必须实现ICustomFormatter接口,并编写自己的代码来从小数部分创建适当的分数。
以下是Jamie建议的实现参见:
using System;
using System.Globalization;
class FractionFormatter :ICustomFormatter, IFormatProvider
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
// Provide default formatting for unsupported argument types.
if (!(arg is decimal))
{
HandleOtherFormats(format, arg);
}
// Provide default formatting for unsupported format strings.
string ufmt = format.ToUpper(CultureInfo.InvariantCulture);
if (ufmt != "H")
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(String.Format("The format of '{0}' is invalid.", format), e);
}
}
decimal value = (decimal)arg;
int wholeNumber = (int)Math.Floor(value);
decimal fraction = value - (decimal)wholeNumber;
if (fraction == 0m)
{
return wholeNumber.ToString();
}
else if (fraction == 0.5m)
{
if (wholeNumber == 0)
{
return "1/2";
}
else
{
return wholeNumber.ToString() + " 1/2";
}
}
else
{
throw new ArgumentOutOfRangeException("arg", "Value must be a multiple of 0.5");
}
}
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
else if (arg != null)
return arg.ToString();
else
return String.Empty;
}
}
这里有一个使用中的例子:
Console.WriteLine(string.Format(new FractionFormatter(), "{0:H}", value));
这就是我最终使用的
public static string ToMixedNumber(this decimal d)
{
if (d == 0) return "";
var s = d.ToString().TrimEnd('0');
if (s.EndsWith(".")) return s.TrimEnd('.');
return s.Split('.')[0] + " 1/2";
}