STR( ) 函数 VFP C# 等价物
STR( ) Function VFP C# equivalent
C# 中是否有与
vfp 中的 STR()
https://msdn.microsoft.com/en-us/library/texae2db(v=vs.80).aspx
? str(111.666666,3,3) --> 112
? str(111.666666,2,3) --> ** 错误
? str(11.666666,2,3) --> 12
?海峡 (0.666666,4,3) --> .667
? str(0.666666,8,3) --> 0.667(即左起3个空格加上结果)
如评论中所述,您可以使用 .ToString() 将数字转换为字符串。您可以在 ToString 中使用标准格式或自定义格式。例如,ToString("C") 根据您的语言环境设置为您提供类似 $123.46 或 €123.46 的字符串,表示值“123.46”。
或者您可以使用自定义格式,例如“0:#.##”。您可以为不同的长度或小数位使用自定义格式。对于 2 个小数位“0:#.##”或 3 个小数位“0:#.###”。
详细的解释可以查看文档。
标准数字格式字符串:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
自定义数字格式字符串:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings
STR 的自定义方法
借助这个 link 我写了一个快速示例。它适用于您的输入,但我没有完全测试。
public static string STR(double d, int totalLen, int decimalPlaces)
{
int floor = (int) Math.Floor(d);
int length = floor.ToString().Length;
if (length > totalLen)
throw new NotImplementedException();
if (totalLen - length < decimalPlaces)
decimalPlaces = totalLen - length;
if (decimalPlaces < 0)
decimalPlaces = 0;
string str = Math.Round(d, decimalPlaces).ToString();
if (str.StartsWith("0") && str.Length > 1 && totalLen - decimalPlaces - 1 <= 0)
str = str.Remove(0,1);
return str.Substring(0, str.Length >= totalLen ? totalLen : str.Length);
}
public static string STR(object value, long totalLen = 0, long decimals = 0) {
string result = string.Empty;
try {
if (value is string) {
return (string)value;
}
var originalDecimals = decimals;
int currentLen = (int)totalLen + 1;
while (currentLen > totalLen) {
string formatString = "{0:N";
formatString += decimals.ToString();
formatString += "}";
result = string.Format(formatString, value);
if (result.StartsWith("0") && result.Length > 1 && totalLen - decimals <= 1) {
// STR(0.5, 3, 2) --> ".50"
result = result.Remove(0, 1);
}
else if (result.StartsWith("-0") && result.Length > 2 && totalLen - decimals <= 2) {
// STR(-0.5, 3, 2) --> "-.5"
result = result.Remove(1, 1);
}
if (totalLen > 0&& result.Length < totalLen && (decimals == originalDecimals || decimals == 0)) {
// STR(20, 3, 2) --> " 20"
result = result.PadLeft((int)totalLen);
}
currentLen = result.Length;
if (currentLen > totalLen) {
decimals--;
if (decimals < 0) {
result = string.Empty.PadRight((int)totalLen, '*');
break;
}
}
}
return result;
}
catch {
result = "***";
}
return result;
}
C# 中是否有与 vfp 中的 STR() https://msdn.microsoft.com/en-us/library/texae2db(v=vs.80).aspx
? str(111.666666,3,3) --> 112
? str(111.666666,2,3) --> ** 错误
? str(11.666666,2,3) --> 12
?海峡 (0.666666,4,3) --> .667
? str(0.666666,8,3) --> 0.667(即左起3个空格加上结果)
如评论中所述,您可以使用 .ToString() 将数字转换为字符串。您可以在 ToString 中使用标准格式或自定义格式。例如,ToString("C") 根据您的语言环境设置为您提供类似 $123.46 或 €123.46 的字符串,表示值“123.46”。
或者您可以使用自定义格式,例如“0:#.##”。您可以为不同的长度或小数位使用自定义格式。对于 2 个小数位“0:#.##”或 3 个小数位“0:#.###”。
详细的解释可以查看文档。
标准数字格式字符串:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings
自定义数字格式字符串:https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings
STR 的自定义方法
借助这个 link 我写了一个快速示例。它适用于您的输入,但我没有完全测试。
public static string STR(double d, int totalLen, int decimalPlaces)
{
int floor = (int) Math.Floor(d);
int length = floor.ToString().Length;
if (length > totalLen)
throw new NotImplementedException();
if (totalLen - length < decimalPlaces)
decimalPlaces = totalLen - length;
if (decimalPlaces < 0)
decimalPlaces = 0;
string str = Math.Round(d, decimalPlaces).ToString();
if (str.StartsWith("0") && str.Length > 1 && totalLen - decimalPlaces - 1 <= 0)
str = str.Remove(0,1);
return str.Substring(0, str.Length >= totalLen ? totalLen : str.Length);
}
public static string STR(object value, long totalLen = 0, long decimals = 0) {
string result = string.Empty;
try {
if (value is string) {
return (string)value;
}
var originalDecimals = decimals;
int currentLen = (int)totalLen + 1;
while (currentLen > totalLen) {
string formatString = "{0:N";
formatString += decimals.ToString();
formatString += "}";
result = string.Format(formatString, value);
if (result.StartsWith("0") && result.Length > 1 && totalLen - decimals <= 1) {
// STR(0.5, 3, 2) --> ".50"
result = result.Remove(0, 1);
}
else if (result.StartsWith("-0") && result.Length > 2 && totalLen - decimals <= 2) {
// STR(-0.5, 3, 2) --> "-.5"
result = result.Remove(1, 1);
}
if (totalLen > 0&& result.Length < totalLen && (decimals == originalDecimals || decimals == 0)) {
// STR(20, 3, 2) --> " 20"
result = result.PadLeft((int)totalLen);
}
currentLen = result.Length;
if (currentLen > totalLen) {
decimals--;
if (decimals < 0) {
result = string.Empty.PadRight((int)totalLen, '*');
break;
}
}
}
return result;
}
catch {
result = "***";
}
return result;
}