public static string GetString(int integer, int fractional100, CurrencyOption option) { if (!(0 <= fractional100 && fractional100 <= 99)) { throw new ArgumentException($"The argument `{nameof(fractional100)}` must be between 0 and 99."); } int index; switch (option.Target) { case CurrencyOption.ETarget.Lower: index = 0; break; case CurrencyOption.ETarget.Upper: index = 1; break; default: throw new NotSupportedException(); } string GetPartString(char[] singles, string level) { if (!singles.Any()) { return(string.Empty); } var sb = new StringBuilder(); var zero = false; foreach (var kv in singles.AsKvPairs()) { if (kv.Value != '0') { var value = NumberValues[index][kv.Value - '0']; var singleNumberUnit = SingleNumberUnits[index][SingleNumberUnits[0].Length - singles.Length + kv.Key]; if (zero) { sb.Append($"{NumberValues[index][0]}{value}{singleNumberUnit}"); } else { sb.Append($"{value}{singleNumberUnit}"); } zero = false; } else { zero = true; } } sb.Append(level); return(sb.ToString()); } //TODO: Use Linqsharp to calculate var levelParts = integer.ToString() .For(parts => parts.AsKvPairs() .GroupBy(x => (x.Key + (4 - parts.Length % 4)) / 4) .Select(g => g.Select(x => x.Value).ToArray())) .ToArray(); var integerRet = levelParts.Select((v, i) => GetPartString(v, Levels[Levels.Length - levelParts.Length + i])).Join(""); if (option.IsSimplified && (integerRet.StartsWith("一十") || integerRet.StartsWith("壹拾"))) { integerRet = integerRet.Substring(1); } if (fractional100 == 0) { return($"{integerRet}{UnitValues[index][0]}整"); } else if (fractional100 % 10 == 0) { return($"{integerRet}{UnitValues[index][0]}{NumberValues[index][fractional100 / 10]}{UnitValues[index][1]}整"); } else { return($"{integerRet}{UnitValues[index][0]}{NumberValues[index][fractional100 / 10]}{UnitValues[index][1]}{NumberValues[index][fractional100 % 10]}{UnitValues[index][2]}"); } }
public static string GetString(double money, CurrencyOption option) => GetString((int)money, (int)(money * 100 % 100), option);