str()函数VFP C#等效



c#中是否有等效函数,其工作方式与VFP中的str()https://msdn.microsoft.com/en-us/library/texae2db(v = vs.80).aspx

?str(111.666666,3,3) -> 112

?str(111.6666666,2,3) -> **错误

?Str(11.666666,2,3) -> 12

?str(0.6666666,4,3) -> .667

?str(0.666666,8,3) -> 0.667(即从左起3个空间加上结果)

如注释中所述,您可以使用.tostring()将数字转换为字符串。您可以在ToString中使用Standart格式或自定义格式。例如,根据您的语言环境设置,ToString(" C")为您提供了一个符合$ 123.46或123.46欧元的字符串。

或者您可以使用" 0:#。##"之类的自定义格式。您可以使用自定义格式用于不同的长度或十进制位置。对于2个小数位置" 0:#。##"或3个小数位置" 0:#。###"。

有关详细说明,您可以检查文档。

标准数字格式字符串:https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-snrings 定义数字格式字符串:https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

str 的自定义方法

在此链接的帮助下,我编写了一个快速示例。它适用于您的输入,但我没有完全测试。

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;
}

相关内容

  • 没有找到相关文章

最新更新