Сумма прописью

ёёёёё
Дата: 17.06.2019 15:55:53
"Двадцать две тысячи рублей 11 копеек" нужно перевести в 22000.11 (currency).

?
Мигалка
Дата: 17.06.2019 16:07:53
  • берём прямую задачу - из числа в буквы
  • заполняем табличку
    digitsletters
    1один
    2два
    ......
    22000Двадцать две тысячи
    ......

  • ...
  • ПРОФИТ!!!
  • ёёёёё
    Дата: 17.06.2019 16:29:19
    Мигалка,

    блестяще!
    alekcvp
    Дата: 17.06.2019 17:20:53
    ёёёёё,

    Ну, намёк он правильный дал. Общая идея примерно такая:

    + осторожно, говнокод!
    program numbers;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils, System.Character;
    
    type
      TNumberWord = record
        Name:  string;
        Value: Integer;
      end;
    
    const
      NumberWords: array [0..37] of TNumberWord = (
        (Name: 'восемнадцать'; Value: 18),
        (Name: 'восемь'; Value: 8),
        (Name: 'восемьдесят'; Value: 80),
        (Name: 'восемьсот'; Value: 800),
        (Name: 'два'; Value: 2),
        (Name: 'двадцать'; Value: 20),
        (Name: 'две'; Value: 2),
        (Name: 'двенадцать'; Value: 12),
        (Name: 'двести'; Value: 200),
        (Name: 'девяносто'; Value: 90),
        (Name: 'девятнадцать'; Value: 19),
        (Name: 'девять'; Value: 9),
        (Name: 'девятьсот'; Value: 900),
        (Name: 'десять'; Value: 10),
        (Name: 'один'; Value: 1),
        (Name: 'одиннадцать'; Value: 11),
        (Name: 'одна'; Value: 1),
        (Name: 'пятнадцать'; Value: 15),
        (Name: 'пять'; Value: 5),
        (Name: 'пятьдесят'; Value: 50),
        (Name: 'пятьсот'; Value: 500),
        (Name: 'семнадцать'; Value: 17),
        (Name: 'семь'; Value: 7),
        (Name: 'семьдесят'; Value: 70),
        (Name: 'семьсот'; Value: 700),
        (Name: 'сорок'; Value: 40),
        (Name: 'сто'; Value: 100),
        (Name: 'три'; Value: 3),
        (Name: 'тридцать'; Value: 30),
        (Name: 'тринадцать'; Value: 13),
        (Name: 'триста'; Value: 300),
        (Name: 'четыре'; Value: 4),
        (Name: 'четыреста'; Value: 400),
        (Name: 'четырнадцать'; Value: 14),
        (Name: 'шестнадцать'; Value:16 ),
        (Name: 'шесть'; Value: 6),
        (Name: 'шестьдесят'; Value: 60),
        (Name: 'шестьсот'; Value: 600));
    
    function FromString(const Value: string): Currency;
    
      function GetWord(var S: PChar): string;
      var
        E: PChar;
        Len: Integer;
      begin
        while S^.IsWhiteSpace do Inc(S);
        E := S;
        while E^.IsLetter do Inc(E);
        SetLength(Result, E - S);
        Move(S^, Result[1], Length(Result) * SizeOf(Char));
        S := E;
      end;
    
    var
      S: PChar;
      Current: string;
      NumWord: TNumberWord;
      NumPart: Int64;
    begin
      Result := 0;
      NumPart := 0;
      S := PChar(Value);
      while S^ <> #0 do
      begin
        Current := GetWord(S);
        if StrLComp(Pointer(Current), 'тысяч', 5) = 0 then
        begin
          Result := Result + NumPart * 1E3;
          NumPart := 0;
        end else if StrLComp(Pointer(Current), 'миллион', 7) = 0 then
        begin
          Result := Result + NumPart * 1E6;
          NumPart := 0;
        end else if StrLComp(Pointer(Current), 'миллиард', 8) = 0 then
        begin
          Result := Result + NumPart * 1E9;
          NumPart := 0;
        end else
          for NumWord in NumberWords do
            if Current = NumWord.Name then
            begin
              NumPart := NumPart + NumWord.Value;
              Break;
            end;
      end;
      Result := Result + NumPart;
    end;
    
    begin
      try
        Writeln(FromString('двенадцать миллионов шестьсот тридцать восемь тысяч сорок два'): 12:2);
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      Readln;
    end.
    
    Док
    Дата: 17.06.2019 19:20:40
    ёёёёё
    блестяще!

    учись, студент!© Картинка с другого сайта.

    зы. на FB форуме куча топиков с готовыми решениями для БД
    KreatorXXI
    Дата: 18.06.2019 10:11:54
    Док,

    дай, пожалуйста, ссылку. Сразу не находится. Может пригодится. Из числа в строку востребовано. Обратная процедура как-то никогда не требовалась.
    DimaBr
    Дата: 18.06.2019 11:09:29
    Обратный перевод слишком трудоёмок и решаем лишь в конкретных случаях.
    Подсунь проге
    "двенадцать млн. шестьсот тридцать восемь тыс. сорок два"
    или
    "двенадцать миллионов шестьсот тридцать восемь тысяч сорок две коп"
    Мигалка
    Дата: 18.06.2019 11:45:21
    DimaBr, какое ТЗ будет так и напишем. частота вариантов написания сильно убывает. можно и "шисот" ловить и "ibcjn". 100% не будет, конечно, но явно >99. взяли текущую базу, конвертнули, посмотрели что не конвертнулось, добавили в алгоритм и вперёд.
    DimaBr
    Дата: 18.06.2019 12:25:35
    Хранить текст в базе ?
    ЗАЧЕМ ?
    Гаджимурадов Рустам
    Дата: 18.06.2019 13:46:32
    Шоб було! (с)

    P.S. Неужто пятница? Смотрю в календарь.
    Нет, всё-таки вторник. Всё врут календари... (с)
    Володя, зачёт.

    Posted via ActualForum NNTP Server 1.5