Страницы: 1
RSS
PQ. Число прописью
 
Здравствуйте!
Прошу подсобить.

Хочу победить перевод числа в текст в PQ. VBA не всегда подходит.
Мне бы концепт, все числа прописью я сам забью.

Спасибо!.
 
упс...
Изменено: Ёк-Мок - 20.05.2020 22:14:03
Удивление есть начало познания © Surprise me!
И да пребудет с нами сила ВПР.
 
Цитата
ivanka написал:
Мне бы концепт
Код
(n)=>
let
    edm = {"","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять "},
    des = {"","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "},
    sot = {"","сто ","двести ","триста ","четыреста ","пятьсот ","шетьсот ","семьсот ","восемьсот ","девятьсот "},
    elv = {"десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ","шестнадцать ","семнадцать ","восемнадцать ","девятнадцать "},
    txt = List.Transform(Text.ToList(Text.PadStart(Text.From(n),3,"0")), each Number.From(_))
in    
    sot{txt{0}} & (if txt{1}<>1 then des{txt{1}} & edm{txt{2}} else elv{txt{2}})
Изменено: buchlotnik - 20.05.2020 22:25:42
Соблюдение правил форума не освобождает от модераторского произвола
 
Ёк-Мок,  а PQ не настораживает ? :-)
По вопросам из тем форума, личку не читаю.
 
buchlotnik, круто! Вангую следующий вопрос: а как просклонять рубли?
Вот горшок пустой, он предмет простой...
 
PooHkrd, в смысле? также как и тысячи, миллионы и т. д.  - ТС просил направление, или нужна полная реализация?
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, я просто смотрю на предыдущие темы ТС и вангую. К вам вообще без претензий, направление задано отлично.
Вот горшок пустой, он предмет простой...
 
PooHkrd, ну а вдруг ))) оставлю своё хулиганство :
Код
 (num)=>
[   ln = {  {"десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ","шестнадцать ","семнадцать ","восемнадцать ","девятнадцать "},
            {"","сто ","двести ","триста ","четыреста ","пятьсот ","шетьсот ","семьсот ","восемьсот ","девятьсот "},
            {"","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "},
            {"","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять "},
            {"","одна ","две ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять "}},
    lr = {  {"","миллиард ","миллиарда ","миллиарда ","миллиарда ","миллиардов "},
            {"","миллион ","миллиона ","миллиона ","миллиона ","миллионов "},
            {"","тысяча ","тысячи ","тысячи ","тысячи ","тысяч "},
            {""," "," "," "," "," "}},  
    fn = (n,r)=> [  t = List.Transform(Text.ToList(n), each Number.From(_)),
                    x = ln{1}{t{0}} & (if t{1}<>1 then ln{2}{t{1}} & (if r = 2 then ln{4}{t{2}} else ln{3}{t{2}}) else ln{0}{t{2}}),
                    y = lr{r}{if t{1}=1 then 5 else List.Min({t{2},5})},
                    z = x&y][z],
    t = Splitter.SplitTextByRepeatedLengths(3)(Number.ToText(num,"000000000000")),
    z = if num = 0 then "ноль" else Text.Combine(List.Transform({0..3},each fn(t{_},_)),"")][z]
Изменено: buchlotnik - 21.05.2020 13:01:32
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, благодарю вас за кейс! Взял для тестирования на своих документах! Я долго искал хотяб наброски, в том числе на англоязычных ресурсах.
Изменено: ivanka - 25.05.2020 21:12:54
 
Цитата
написал:
PooHkrd, ну а вдруг ))) оставлю своё хулиганство :
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16      (num)=>    [   ln = {  {  "десять "  ,  "одиннадцать "  ,  "двенадцать "  ,  "тринадцать "  ,  "четырнадцать "  ,  "пятнадцать "  ,  "шестнадцать "  ,  "семнадцать "  ,  "восемнадцать "  ,  "девятнадцать "  },                  {  ""  ,  "сто "  ,  "двести "  ,  "триста "  ,  "четыреста "  ,  "пятьсот "  ,  "шетьсот "  ,  "семьсот "  ,  "восемьсот "  ,  "девятьсот "  },                  {  ""  ,  ""  ,  "двадцать "  ,  "тридцать "  ,  "сорок "  ,  "пятьдесят "  ,  "шестьдесят "  ,  "семьдесят "  ,  "восемьдесят "  ,  "девяносто "  },                  {  ""  ,  "один "  ,  "два "  ,  "три "  ,  "четыре "  ,  "пять "  ,  "шесть "  ,  "семь "  ,  "восемь "  ,  "девять "  },                  {  ""  ,  "одна "  ,  "две "  ,  "три "  ,  "четыре "  ,  "пять "  ,  "шесть "  ,  "семь "  ,  "восемь "  ,  "девять "  }},          lr = {  {  ""  ,  "миллиард "  ,  "миллиарда "  ,  "миллиарда "  ,  "миллиарда "  ,  "миллиардов "  },                  {  ""  ,  "миллион "  ,  "миллиона "  ,  "миллиона "  ,  "миллиона "  ,  "миллионов "  },                  {  ""  ,  "тысяча "  ,  "тысячи "  ,  "тысячи "  ,  "тысячи "  ,  "тысяч "  },                  {  ""  ,  " "  ,  " "  ,  " "  ,  " "  ,  " "  }},            fn = (n,r)=> [  t = List.Transform(Text.ToList(n), each Number.From(_)),                          x = ln{1}{t{0}} & (if t{1}<>1 then ln{2}{t{1}} & (if r = 2 then ln{4}{t{2}} else ln{3}{t{2}}) else ln{0}{t{2}}),                          y = lr{r}{if t{1}=1 then 5 else List.Min({t{2},5})},                          z = x&y][z],          t = Splitter.SplitTextByRepeatedLengths(3)(Number.ToText(num,  "000000000000"  )),          z = if num = 0 then   "ноль"   else Text.Combine(List.Transform({0..3},each fn(t{_},_)),  ""  )][z]   
 
Здравствуйте.
Ваша функция замечательная, спасибо большое.
Но не могли бы вы помочь исправить ошибку в вашей функции? Не могу никак разобраться, что нужно поправить.
Число 550 063 399.92 пишет прописью как Пятьсот пятьдесят шестьдесят три тысячи четыреста. Пропускает разряд «миллионов, миллиона», если в единицах миллионов идет ноль.
А вот число 554 804 641.57 — уже с миллионом: Пятьсот пятьдесят четыре миллиона восемьсот четыре тысячи шестьсот сорок два пятьдесят шестьдесят три тысячи четыреста.

Мне по-хорошему нужны рубли с копейками, но хотя бы только рубли верно писать)).
Заранее спасибо.
 
 
Наталья Ссс, посмотрите тут.
Вот горшок пустой, он предмет простой...
 
Цитата
написал:
Наталья Ссс, посмотрите  тут .
Спасибо большое! :D  
 
PooHkrd, скажите, почему у меня не находит этот Телеграм-канал в Телеграме? Как на него подписаться?
 
Zagadka, а зачем его искать? Откройте форум с телефона и тыкайте в ссылку, она сама в телеге откроется.
Вот горшок пустой, он предмет простой...
 
Извиняюсь не увидел что надо в PQ.
Пробуйте эту формулу (где i21 ячейка с числом):
Код
=@ИНДЕКС({"";"сто ";"двести ";"триста ";"четыреста ";"пятьсот ";"шестьсот ";"семьсот ";"восемьсот ";"девятьсот "};ОСТАТ(ОТБР(I21/10^8);10)+1)&@ВЫБОР(ОСТАТ(ОТБР(I21/10^7);10)+1;"";ИНДЕКС({"десять ";"одиннадцать ";"двенадцать ";"тринадцать ";"четырнадцать ";"пятнадцать ";"шестнадцать ";"семнадцать ";"восемнадцать ";"девятнадцать "};ОСТАТ(ОТБР(I21/10^6);10)+1);"двадцать ";"тридцать ";"сорок ";"пятьдесят ";"шестьдесят ";"семьдесят ";"восемьдесят ";"девяносто ")&@ЕСЛИ(ОСТАТ(ОТБР(I21/10^7);10)<>1;ИНДЕКС({"";"один ";"два ";"три ";"четыре ";"пять ";"шесть ";"семь ";"восемь ";"девять "};ОСТАТ(ОТБР(I21/10^6);10)+1);"")&ЕСЛИ(ОСТАТ(ОТБР(I21/10^6);1000);"миллион"&ЕСЛИ(ОСТАТ(ОТБР(I21/10^7);10)=1;"ов ";ВПР(ОСТАТ(ОТБР(I21/10^6);10);{0;"ов ":1;" ":2;"а ":5;"ов "};2));"")&@ИНДЕКС({"";"сто ";"двести ";"триста ";"четыреста ";"пятьсот ";"шестьсот ";"семьсот ";"восемьсот ";"девятьсот "};ОСТАТ(ОТБР(I21/10^5);10)+1)&@ВЫБОР(ОСТАТ(ОТБР(I21/10^4);10)+1;"";ИНДЕКС({"десять ";"одиннадцать ";"двенадцать ";"тринадцать ";"четырнадцать ";"пятнадцать ";"шестнадцать ";"семнадцать ";"восемнадцать ";"девятнадцать "};ОСТАТ(ОТБР(I21/1000);10)+1);"двадцать ";"тридцать ";"сорок ";"пятьдесят ";"шестьдесят ";"семьдесят ";"восемьдесят ";"девяносто ")&@ЕСЛИ(ОСТАТ(ОТБР(I21/10^4);10)<>1;ИНДЕКС({"";"одна ";"две ";"три ";"четыре ";"пять ";"шесть ";"семь ";"восемь ";"девять "};ОСТАТ(ОТБР(I21/1000);10)+1);"")&ЕСЛИ(ОСТАТ(ОТБР(I21/1000);1000);"тысяч"&ЕСЛИ(ОСТАТ(ОТБР(I21/10^4);10)=1;" ";ВПР(ОСТАТ(ОТБР(I21/1000);10);{0;" ":1;"а ":2;"и ":5;" "};2));"")&@ИНДЕКС({"";"сто ";"двести ";"триста ";"четыреста ";"пятьсот ";"шестьсот ";"семьсот ";"восемьсот ";"девятьсот "};ОСТАТ(ОТБР(I21/100);10)+1)&@ВЫБОР(ОСТАТ(ОТБР(I21/10);10)+1;"";ИНДЕКС({"десять ";"одиннадцать ";"двенадцать ";"тринадцать ";"четырнадцать ";"пятнадцать ";"шестнадцать ";"семнадцать ";"восемнадцать ";"девятнадцать "};ОСТАТ(ОТБР(I21);10)+1);"двадцать ";"тридцать ";"сорок ";"пятьдесят ";"шестьдесят ";"семьдесят ";"восемьдесят ";"девяносто ")&@ЕСЛИ(ОТБР(I21)=0;"ноль ";ЕСЛИ(ОСТАТ(ОТБР(I21/10);10)<>1;ИНДЕКС({"";"один ";"два ";"три ";"четыре ";"пять ";"шесть ";"семь ";"восемь ";"девять "};ОСТАТ(ОТБР(I21);10)+1);""))&"рубл"&ЕСЛИ(ОСТАТ(ОТБР(I21/10);10)=1;"ей";ВПР(ОСТАТ(ОТБР(I21);10);{0;"ей":1;"ь":2;"я":5;"ей"};2))&ТЕКСТ(ОТБР((I21-ОТБР(I21)+0,00001)*100);" 00\ коп.;;")
Изменено: Евгений Иванов - 06.07.2022 10:56:10
Страницы: 1
Наверх