考虑以下课程。
public class DoubleSegment
{
public int MinLength { get; }
public int MaxLength { get; }
public double Value { get; }
public string GetString(CultureInfo culture)
{
return Value.ToString(culture); // this is the easy but incorrect way
}
}
如您所见,长度要求完全被忽略,这显然是错误的。现在假设我们有MinLength=4
,MaxLength=4
和Value=954
。如何将Value
转换为"0954"
?
请注意,此解决方案还必须适用于MinLength=4
,MaxLength=10
和Value=58723.9843
,这会产生"58723.9843"
(至少对culture == CultureInfo.InvariantCulture
而言)。
答案 0 :(得分:2)
您可以使用填充来填充字符串中的0。
int value = 324;
var paddedValue = value.ToString().PadLeft(4,'0'));
答案 1 :(得分:1)
您可以使用String.PadLeft方法。
string x= Value.ToString(culture);
x.PadLeft(MaxLength -x.Length,'0');
答案 2 :(得分:1)
这比初看起来更复杂。你需要考虑:
我的解决方案:
public string GetString(CultureInfo culture) {
var integral = (int)Math.Truncate(Value);
var integralLength = integral.ToString().Length;
if (integralLength > MaxLength) {
throw new InvalidOperationException();
}
var integralWithDecimalSeparatorLength = integralLength + culture.NumberFormat.NumberDecimalSeparator.Length;
var minimumFixedPointLength = integralWithDecimalSeparatorLength + 1;
if (minimumFixedPointLength > MaxLength) {
var intValue = (int)Math.Round(Value);
return intValue.ToString("D" + MinLength, culture);
}
var precision = MaxLength - integralWithDecimalSeparatorLength;
return Value.ToString("F" + precision, culture);
}
首先,如果值的整数部分(不包括小数)太长,则该值太大。否则,基于剩余的可用空间计算用于定点(“F”)字符串格式的精度。如果没有足够的空间,则使用舍入整数。定点格式的最小长度是积分,小数点和单个十进制数字(总是至少有一个,它不会格式化为一个尾随的小数点)。
使用MinLength=4
,MaxLength=4
和Value=954
,输出为"0954"
,但Value=54
为"54.0"
,因为有.0
足够Value=987.654
的空间。这也可以支持小数分隔符长度超过一个字符的文化,虽然我不确定是否存在任何字符。
更多例子:
MinLength=4
,MaxLength=4
,"0988"
:Value=987.654
MinLength=3
,MaxLength=4
,"988"
:Value=987.654
MinLength=4
,MaxLength=5
,"987.7"
:Value=987.654
MinLength=4
,MaxLength=10
,"987.654000"
:{{1}}
答案 3 :(得分:0)
也许是这样的?
int min_Length = 4;
int max_Length = 10;
dobule Value = 56665.66;
String temp = Value.ToString(culture); // this is the easy but incorrect way
if (temp.Length < min_Length)
{
while (temp.Length < min_Length)
{
temp = "0" + temp;
}
}
else if (temp.Length > max_Length)
{
temp = temp.Substring(0, max_Length);
}
return temp;