/// <summary> /// Возвращает SpellOut числа. /// </summary> public static string SpellOut(uint number, IMeasureUnit mu, Заглавные заглавные) { return ApplyCaps(SpellOut(number, mu, new StringBuilder()), заглавные); }
/// <summary> </summary> public Currency(IMeasureUnit основная, IMeasureUnit floatPart) { this.main = основная; this.floatPart = floatPart; }
public static string Normalize(IMeasureUnit measureUnit, uint number) { uint numberN = number%10; uint number10n = (number/10)%10; if (number10n == 1) return measureUnit.GenitivePlural; switch (numberN) { case 1: return measureUnit.NominativeSingle; case 2: case 3: case 4: return measureUnit.GenitiveSingle; default: return measureUnit.GenitivePlural; } }
/// <summary> /// Возвращает SpellOut числа строчными буквами. /// </summary> public static string SpellOut(uint number, IMeasureUnit mu) { return SpellOut(number, mu, Заглавные.Нет); }
private static void SpellOutUnit(uint numberLT999, IMeasureUnit unit, MyStringBuilder sb) { uint numberN = numberLT999%10; uint number10n = (numberLT999/10)%10; uint number100n = (numberLT999/100)%10; sb.Append(Сотни[number100n]); if ((numberLT999%100) != 0) { Tens[number10n].SpellOut(sb, numberN, unit.NumberForm); } // Добавить название класса в нужной форме. sb.Append(Normalize(unit, numberLT999)); }
/// <summary> /// Получить SpellOut числа с согласованной единицей измерения. /// </summary> /// <returns> <paramref name="result"/> </returns> public static StringBuilder SpellOut(uint number, IMeasureUnit mu, StringBuilder result) { MyStringBuilder mySb = new MyStringBuilder(result); if (number == 0) { mySb.Append("ноль"); //mySb.Append(mu.РодМнож); } else { uint div1000 = number/1000; SpellOutСтаршихКлассов(div1000, 0, mySb); SpellOutUnit(number - div1000*1000, mu, mySb); } return result; }
public static StringBuilder SpellOut(ulong number, IMeasureUnit mu, StringBuilder result) { if (number <= uint.MaxValue) { SpellOut((uint) number, mu, result); } else { MyStringBuilder mySb = new MyStringBuilder(result); ulong div1000 = number/1000; SpellOutСтаршихКлассов(div1000, 0, mySb); SpellOutUnit((uint) (number - div1000*1000), mu, mySb); } return result; }
public static StringBuilder SpellOut(double number, IMeasureUnit mu, StringBuilder result) { string error = CheckNumber(number); if (error != null) throw new ArgumentException(error, "number"); if (number <= uint.MaxValue) { SpellOut((uint) number, mu, result); } else if (number <= ulong.MaxValue) { // SpellOut с ulong выполняется в среднем в 2 раза быстрее. SpellOut((ulong) number, mu, result); } else { MyStringBuilder mySb = new MyStringBuilder(result); double div1000 = Math.Floor(number/1000); SpellOutСтаршихКлассов(div1000, 0, mySb); SpellOutUnit((uint) (number - div1000*1000), mu, mySb); } return result; }
public static StringBuilder SpellOut(decimal number, IMeasureUnit mu, StringBuilder result) { string error = CheckNumber(number); if (error != null) throw new ArgumentException(error, "number"); // Целочисленные версии работают в разы быстрее, чем decimal. if (number <= uint.MaxValue) { SpellOut((uint) number, mu, result); } else if (number <= ulong.MaxValue) { SpellOut((ulong) number, mu, result); } else { var mySb = new MyStringBuilder(result); decimal div1000 = Math.Floor(number/1000); SpellOutСтаршихКлассов(div1000, 0, mySb); SpellOutUnit((uint) (number - div1000*1000), mu, mySb); } return result; }