Войти
NeoBooker.ru
Добро пожаловать к нам в гости!
Наш сайт посвящён программе NeoBook, с помощью которой вы легко сможете создавать собственные мультимедиа-приложения без необходимости изучать сложные языки программирования! Зарегистрируйтесь, чтобы стать членом нашего сообщества.
Страница 1 из 11
Модератор форума: Peter, DEMBEL 
Форум NeoBook » Всё о программе NeoBook » Сценарии и скриптовые языки в Neobook » Сумма прописью (Вывод суммы прописью)
Сумма прописью
NegiboДата: Сб, 13 Августа 2016, 11:10 | Сообщение # 1
Новичок
Подскажите, каким методом можно получить сумму прописью, если это вообще возможно?..
 
СообщениеПодскажите, каким методом можно получить сумму прописью, если это вообще возможно?..

Автор - Negibo
Дата добавления - 13 Августа 2016 в 11:10
mishemДата: Вс, 14 Августа 2016, 21:53 | Сообщение # 2
Эксперт форума
Цитата Negibo ()
если это вообще возможно?..

Это один из примеров где лучше использовать плагин.
Вот так примерно выглядит код на Делфи
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var st:string;
    n,i:integer;
    c:array[1..4]of integer;
    s:array[1..4,1..3]of string;
begin
s[1,1]:='миллиард';
s[1,2]:='миллиарда';
s[1,3]:='миллиардов';
s[2,1]:='миллион';
s[2,2]:='миллиона';
s[2,3]:='миллионов';
s[3,1]:='тысяча';
s[3,2]:='тысячи';
s[3,3]:='тысяч';
s[4,1]:='';
s[4,2]:='';
s[4,3]:='';
write('Введите число до 2 147 483 647 n=');
readln(n);
st:='';
c[1]:=n div 1000000000;
c[2]:=(n mod 1000000000) div 1000000;
c[3]:=(n mod 1000000) div 1000;
c[4]:=n mod 1000;
for i:=1 to 4 do
write(c[i],' ');
writeln;
for i:=1 to 4 do
if c[i]<>0 then
begin
  if c[i] div 100<>0 then
  case c[i] div 100 of
  1:st:=st+'сто';
  2:st:=st+'двести';
  3:st:=st+'триста';
  4:st:=st+'четыреста';
  5:st:=st+'пятьсот';
  6:st:=st+'шестьсот';
  7:st:=st+'семьсот';
  8:st:=st+'восемьсот';
  9:st:=st+'девятьсот';
  end;
  if (c[i] mod 100) div 10<>1 then
   begin
    case (c[i] mod 100) div 10 of
    2:st:=st+' двадцать';
    3:st:=st+' тридцать';
    4:st:=st+' сорок';
    5:st:=st+' пятьдесят';
    6:st:=st+' шестьдесят';
    7:st:=st+' семьдесят';
    8:st:=st+' восемьдесят';
    9:st:=st+' девяносто';
    end;
    case c[i] mod 10 of
    1:if i=3 then st:=st+' одна' else st:=st+' один';
    2:if i=3 then st:=st+' две' else st:=st+' два';
    3:st:=st+' три';
    4:st:=st+' четыре';
    5:st:=st+' пять';
    6:st:=st+' шесть';
    7:st:=st+' семь';
    8:st:=st+' восемь';
    9:st:=st+' девять';
    end;
   end
  else
   case (c[i] mod 100) of
   10:st:=st+' десять';
   11:st:=st+' одиннадцать';
   12:st:=st+' двенадцать';
   13:st:=st+' тринадцать';
   14:st:=st+' четырнадцать';
   15:st:=st+' пятндцать';
   16:st:=st+' шестнадцать';
   17:st:=st+' семнадцать';
   18:st:=st+' восемнадцать';
   19:st:=st+' девятнадцать';
   end;
   if (c[i] mod 100>=10) and (c[i] mod 100<=19) then st:=st+' '+s[i,3]+' '
   else
   case c[i] mod 10 of
   1:st:=st+' '+s[i,1]+' ';
   2..4:st:=st+' '+s[i,2]+' ';
   5..9,0:st:=st+' '+s[i,3]+' ';
   end;
end;
writeln(st);
readln;
end.

в NeoBook код будет на много больше. Но в целях развития можно попытаться написать. В принципе ничего сложного, просто слишком много писанины.

Для примера вот так мы запишем число от 1 до 19
Код
StrLen "[TextEntry1]" "[Result]"

IfEx "[Result]=1 or [Result]=2 and [TextEntry1]<20"
    SetVar "[Trunc]" "1"
    Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"

    SetVar "[Num1]" "один"
    SetVar "[Num2]" "два"
    SetVar "[Num3]" "три"
    SetVar "[Num4]" "четыре"
    SetVar "[Num5]" "пять"
    SetVar "[Num6]" "шесть"
    SetVar "[Num7]" "семь"
    SetVar "[Num8]" "восемь"
    SetVar "[Num9]" "девять"
    SetVar "[Num10]" "десять"
    SetVar "[Num11]" "одиннадцать"
    SetVar "[Num12]" "двенадцать"
    SetVar "[Num13]" "тринадцать"
    SetVar "[Num14]" "четырнадцать"
    SetVar "[Num15]" "пятнадцать"
    SetVar "[Num16]" "шестнадцать"
    SetVar "[Num17]" "семнадцать"
    SetVar "[Num18]" "восемнадцать"
    SetVar "[Num19]" "девятнадцать"
    SetVar "[Result]" "[Num[Num]]"
EndIf


Вот так мы определим сотни, тысячи, миллионы
Код
StrLen "[TextEntry1]" "[Result]"
If "[Result]" "=" "3"
    SetVar "[Trunc]" "100"
    SetVar "[Result]" "сотни"
EndIf
IfEx "[Result]=4 or [Result]=5 or [Result]=6"
    SetVar "[Trunc]" "1000"
    SetVar "[Result]" "тысячи"
EndIf
IfEx "[Result]=7 or [Result]=8 or [Result]=9"
    SetVar "[Trunc]" "1000000"
    SetVar "[Result]" "миллионы"
EndIf
Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"


Взяли число, определили сначала допустим что это миллионы.
получили сколько миллионов.
Код
IfEx "[Result]=7 or [Result]=8 or [Result]=9"
    SetVar "[Trunc]" "1000000"
    SetVar "[Result]" "миллионы"
EndIf
Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"

Добавили в этот код еще условие в каком случае пишется миллиона, миллионов и т.д.

Удалили сначала числа те цифры которые записали. Вычислили тысячи, записали. Удалили опять сначала числа. Вычислили сотни, записали и т.д.


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.


Сообщение отредактировано
mishem - Вс, 14 Августа 2016, 21:55
 
Сообщение
Цитата Negibo ()
если это вообще возможно?..

Это один из примеров где лучше использовать плагин.
Вот так примерно выглядит код на Делфи
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var st:string;
    n,i:integer;
    c:array[1..4]of integer;
    s:array[1..4,1..3]of string;
begin
s[1,1]:='миллиард';
s[1,2]:='миллиарда';
s[1,3]:='миллиардов';
s[2,1]:='миллион';
s[2,2]:='миллиона';
s[2,3]:='миллионов';
s[3,1]:='тысяча';
s[3,2]:='тысячи';
s[3,3]:='тысяч';
s[4,1]:='';
s[4,2]:='';
s[4,3]:='';
write('Введите число до 2 147 483 647 n=');
readln(n);
st:='';
c[1]:=n div 1000000000;
c[2]:=(n mod 1000000000) div 1000000;
c[3]:=(n mod 1000000) div 1000;
c[4]:=n mod 1000;
for i:=1 to 4 do
write(c[i],' ');
writeln;
for i:=1 to 4 do
if c[i]<>0 then
begin
  if c[i] div 100<>0 then
  case c[i] div 100 of
  1:st:=st+'сто';
  2:st:=st+'двести';
  3:st:=st+'триста';
  4:st:=st+'четыреста';
  5:st:=st+'пятьсот';
  6:st:=st+'шестьсот';
  7:st:=st+'семьсот';
  8:st:=st+'восемьсот';
  9:st:=st+'девятьсот';
  end;
  if (c[i] mod 100) div 10<>1 then
   begin
    case (c[i] mod 100) div 10 of
    2:st:=st+' двадцать';
    3:st:=st+' тридцать';
    4:st:=st+' сорок';
    5:st:=st+' пятьдесят';
    6:st:=st+' шестьдесят';
    7:st:=st+' семьдесят';
    8:st:=st+' восемьдесят';
    9:st:=st+' девяносто';
    end;
    case c[i] mod 10 of
    1:if i=3 then st:=st+' одна' else st:=st+' один';
    2:if i=3 then st:=st+' две' else st:=st+' два';
    3:st:=st+' три';
    4:st:=st+' четыре';
    5:st:=st+' пять';
    6:st:=st+' шесть';
    7:st:=st+' семь';
    8:st:=st+' восемь';
    9:st:=st+' девять';
    end;
   end
  else
   case (c[i] mod 100) of
   10:st:=st+' десять';
   11:st:=st+' одиннадцать';
   12:st:=st+' двенадцать';
   13:st:=st+' тринадцать';
   14:st:=st+' четырнадцать';
   15:st:=st+' пятндцать';
   16:st:=st+' шестнадцать';
   17:st:=st+' семнадцать';
   18:st:=st+' восемнадцать';
   19:st:=st+' девятнадцать';
   end;
   if (c[i] mod 100>=10) and (c[i] mod 100<=19) then st:=st+' '+s[i,3]+' '
   else
   case c[i] mod 10 of
   1:st:=st+' '+s[i,1]+' ';
   2..4:st:=st+' '+s[i,2]+' ';
   5..9,0:st:=st+' '+s[i,3]+' ';
   end;
end;
writeln(st);
readln;
end.

в NeoBook код будет на много больше. Но в целях развития можно попытаться написать. В принципе ничего сложного, просто слишком много писанины.

Для примера вот так мы запишем число от 1 до 19
Код
StrLen "[TextEntry1]" "[Result]"

IfEx "[Result]=1 or [Result]=2 and [TextEntry1]<20"
    SetVar "[Trunc]" "1"
    Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"

    SetVar "[Num1]" "один"
    SetVar "[Num2]" "два"
    SetVar "[Num3]" "три"
    SetVar "[Num4]" "четыре"
    SetVar "[Num5]" "пять"
    SetVar "[Num6]" "шесть"
    SetVar "[Num7]" "семь"
    SetVar "[Num8]" "восемь"
    SetVar "[Num9]" "девять"
    SetVar "[Num10]" "десять"
    SetVar "[Num11]" "одиннадцать"
    SetVar "[Num12]" "двенадцать"
    SetVar "[Num13]" "тринадцать"
    SetVar "[Num14]" "четырнадцать"
    SetVar "[Num15]" "пятнадцать"
    SetVar "[Num16]" "шестнадцать"
    SetVar "[Num17]" "семнадцать"
    SetVar "[Num18]" "восемнадцать"
    SetVar "[Num19]" "девятнадцать"
    SetVar "[Result]" "[Num[Num]]"
EndIf


Вот так мы определим сотни, тысячи, миллионы
Код
StrLen "[TextEntry1]" "[Result]"
If "[Result]" "=" "3"
    SetVar "[Trunc]" "100"
    SetVar "[Result]" "сотни"
EndIf
IfEx "[Result]=4 or [Result]=5 or [Result]=6"
    SetVar "[Trunc]" "1000"
    SetVar "[Result]" "тысячи"
EndIf
IfEx "[Result]=7 or [Result]=8 or [Result]=9"
    SetVar "[Trunc]" "1000000"
    SetVar "[Result]" "миллионы"
EndIf
Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"


Взяли число, определили сначала допустим что это миллионы.
получили сколько миллионов.
Код
IfEx "[Result]=7 or [Result]=8 or [Result]=9"
    SetVar "[Trunc]" "1000000"
    SetVar "[Result]" "миллионы"
EndIf
Math "Trunc([TextEntry1]/[Trunc])" "-1" "[Num]"

Добавили в этот код еще условие в каком случае пишется миллиона, миллионов и т.д.

Удалили сначала числа те цифры которые записали. Вычислили тысячи, записали. Удалили опять сначала числа. Вычислили сотни, записали и т.д.

Автор - mishem
Дата добавления - 14 Августа 2016 в 21:53
PeterДата: Пн, 15 Августа 2016, 05:08 | Сообщение # 3
Админ NeoBook
Гм....
%)
А если попробовать составить "матрицу" (двухмерный массив), например, такого типа:
Код
SetVar "[S1]" "один,одинадцать,десять,сто"
SetVar "[S2]" "два,двенадцать,двадцать,двести"
SetVar "[S3]" "три,тринадцать,тридцать,триста"
SetVar "[S4]" "четыре,четырнадцать,сорок,четыреста"
SetVar "[S5]" "пять,пятнадцать,пятьдесят,пятьсот"
SetVar "[S6]" "шесть,шестнадцать,шестьдесят,шестьсот"
SetVar "[S7]" "семь,семьнадцать,семдьдесят,семьсот"
SetVar "[S8]" "восемь,восемнадцать,восемьдесят,восемьсот"
SetVar "[S9]" "девять,девятнадцать,девяносто,девятьсот"
SetVar "[S0]" "ноль"


Брать первую цифру в строке (должно быть разбито на группы по 3 знака) - она автоматом попадает на соответствующую порядковую переменную массива, а далее анализом длины и перебором группы подставлять соответствующее слово?
;)
В принципе, все просто, единственная загвоздка - предусмотреть в обработке второй десяток (который от 11 до 19), остальное же формируется по шаблону.



- А вам какую операционку поставить - экспи, семерку или висту?
- Это ты сейчас о чем?
- Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный?
- Ну, конечно, надежный!
- Вот, значит - экспи, без вопросов! Сейчас сделаем...

(Улицы разбитых фонарей, сезон 10, серия 17)

Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!


При модном втюхе модоподдающимся начинает нравиться
 
СообщениеГм....
%)
А если попробовать составить "матрицу" (двухмерный массив), например, такого типа:
Код
SetVar "[S1]" "один,одинадцать,десять,сто"
SetVar "[S2]" "два,двенадцать,двадцать,двести"
SetVar "[S3]" "три,тринадцать,тридцать,триста"
SetVar "[S4]" "четыре,четырнадцать,сорок,четыреста"
SetVar "[S5]" "пять,пятнадцать,пятьдесят,пятьсот"
SetVar "[S6]" "шесть,шестнадцать,шестьдесят,шестьсот"
SetVar "[S7]" "семь,семьнадцать,семдьдесят,семьсот"
SetVar "[S8]" "восемь,восемнадцать,восемьдесят,восемьсот"
SetVar "[S9]" "девять,девятнадцать,девяносто,девятьсот"
SetVar "[S0]" "ноль"


Брать первую цифру в строке (должно быть разбито на группы по 3 знака) - она автоматом попадает на соответствующую порядковую переменную массива, а далее анализом длины и перебором группы подставлять соответствующее слово?
;)
В принципе, все просто, единственная загвоздка - предусмотреть в обработке второй десяток (который от 11 до 19), остальное же формируется по шаблону.


Автор - Peter
Дата добавления - 15 Августа 2016 в 05:08
mishemДата: Пн, 15 Августа 2016, 06:10 | Сообщение # 4
Эксперт форума
Цитата Peter ()
А если попробовать

Я примитивный вариант дал. Первое что пришло в голову. А так, естественно нужно составлять массивы, использовать циклы и т.д.

Однако думать надо...
А в последнее время что то так не охота. :(



Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
Сообщение
Цитата Peter ()
А если попробовать

Я примитивный вариант дал. Первое что пришло в голову. А так, естественно нужно составлять массивы, использовать циклы и т.д.

Однако думать надо...
А в последнее время что то так не охота. :(


Автор - mishem
Дата добавления - 15 Августа 2016 в 06:10
PeterДата: Пн, 15 Августа 2016, 11:24 | Сообщение # 5
Админ NeoBook
Цитата mishem ()
Первое что пришло в голову.

Да я тоже не особо напрягался.
Кстати, надо учитывать еще и род: ОДИН миллион, ОДНА тысяча, и т.п.
Ясно только, что задачу вполне возможно решить средствами NB, вот только подумать надобно, а оно как-то влом в последнее время.
:)



- А вам какую операционку поставить - экспи, семерку или висту?
- Это ты сейчас о чем?
- Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный?
- Ну, конечно, надежный!
- Вот, значит - экспи, без вопросов! Сейчас сделаем...

(Улицы разбитых фонарей, сезон 10, серия 17)

Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!


При модном втюхе модоподдающимся начинает нравиться
 
Сообщение
Цитата mishem ()
Первое что пришло в голову.

Да я тоже не особо напрягался.
Кстати, надо учитывать еще и род: ОДИН миллион, ОДНА тысяча, и т.п.
Ясно только, что задачу вполне возможно решить средствами NB, вот только подумать надобно, а оно как-то влом в последнее время.
:)


Автор - Peter
Дата добавления - 15 Августа 2016 в 11:24
mishemДата: Вт, 16 Августа 2016, 02:28 | Сообщение # 6
Эксперт форума
Накидал до триллионов. :D

У кого есть желание, можете оптимизировать код.
Начиная с миллионов идет просто повторение кода с заменой текста. Так что если кому то надо больше, добавить не проблема.
Прикрепления: Numbers_in_curs.zip(3Kb)


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
СообщениеНакидал до триллионов. :D

У кого есть желание, можете оптимизировать код.
Начиная с миллионов идет просто повторение кода с заменой текста. Так что если кому то надо больше, добавить не проблема.

Автор - mishem
Дата добавления - 16 Августа 2016 в 02:28
PeterДата: Вт, 16 Августа 2016, 04:56 | Сообщение # 7
Админ NeoBook
Цитата mishem ()
Накидал до триллионов.

Гм...
Чего-то у тебя там слишком все "длинно" получилось - запаришься разбираться!
:)
Мне думается, что можно все проще забацать(?), но подождем мнение автора темы, а то получится, как обычно - вопрос задали, паришься-паришься, а ТС пропал (хорошо если не навсегда), или "нужно, но не очень и не сейчас, это я типа спросил на всякий случай, из любопытства".
Вспомни, например, эту тему.
:)



- А вам какую операционку поставить - экспи, семерку или висту?
- Это ты сейчас о чем?
- Олег Георгиевич, вам какой компьютер хотелось бы - молодежный или надежный?
- Ну, конечно, надежный!
- Вот, значит - экспи, без вопросов! Сейчас сделаем...

(Улицы разбитых фонарей, сезон 10, серия 17)

Единственная инновация Windows 8 это - Metro, чтобы дебилы по иконкам не промахивались!


При модном втюхе модоподдающимся начинает нравиться
 
Сообщение
Цитата mishem ()
Накидал до триллионов.

Гм...
Чего-то у тебя там слишком все "длинно" получилось - запаришься разбираться!
:)
Мне думается, что можно все проще забацать(?), но подождем мнение автора темы, а то получится, как обычно - вопрос задали, паришься-паришься, а ТС пропал (хорошо если не навсегда), или "нужно, но не очень и не сейчас, это я типа спросил на всякий случай, из любопытства".
Вспомни, например, эту тему.
:)


Автор - Peter
Дата добавления - 16 Августа 2016 в 04:56
mishemДата: Вт, 16 Августа 2016, 21:40 | Сообщение # 8
Эксперт форума
Подкорректировал код. Сделал до дециллионов. :D 36 знаков
Можно и больше добавить, если кому понадобится.

Цитата Peter ()
Чего-то у тебя там слишком все "длинно" получилось - запаришься разбираться!

Я ж говорю это не делфи. :)

Цитата Peter ()
Мне думается, что можно все проще забацать(?)

Попробуй. Покажешь.

Цитата Peter ()
ТС пропал

Пропал, и пропал...
Я давно уже хотел что то подобное сделать. :)
Другим мож пригодится.

Где то плагин есть, только числа пишет не по русски. Мож как нибудь на досуге вспомню про него, поковыряю. В смысле что б по русски писал.
Прикрепления: 3655144.zip(3Kb)


Не хочешь читать хелп?

Если хелп и форум не помогли, тогда все ответы здесь



Если вы думаете, что сможете — вы сможете, если думаете, что нет — вы правы.
 
СообщениеПодкорректировал код. Сделал до дециллионов. :D 36 знаков
Можно и больше добавить, если кому понадобится.

Цитата Peter ()
Чего-то у тебя там слишком все "длинно" получилось - запаришься разбираться!

Я ж говорю это не делфи. :)

Цитата Peter ()
Мне думается, что можно все проще забацать(?)

Попробуй. Покажешь.

Цитата Peter ()
ТС пропал

Пропал, и пропал...
Я давно уже хотел что то подобное сделать. :)
Другим мож пригодится.

Где то плагин есть, только числа пишет не по русски. Мож как нибудь на досуге вспомню про него, поковыряю. В смысле что б по русски писал.

Автор - mishem
Дата добавления - 16 Августа 2016 в 21:40
NegiboДата: Ср, 17 Августа 2016, 19:42 | Сообщение # 9
Новичок
Цитата mishem ()
Накидал до триллионов.

Спасибо, я уже думал использовать JavaScript, только не понял как прикрутить к NB
Код
Number.prototype.toPhrase=function(c)
// сумма прописью для чисел от 0 до 999 триллионов
// можно передать параметр "валюта": RUB,USD,EUR (по умолчанию RUB)
{
  var x=this.roundTo(2);
  if (x<0 || x>999999999999999.99) return false;

  var currency='RUB';
  if (typeof(c)=='string')
    currency=c.trimAll().toUpperCase();

  if (currency=='RUR') currency='RUB';
  if (currency!='RUB' && currency!='USD' && currency!='EUR')
    return false;

  var groups=new Array();

  groups[0]=new Array();
  groups[1]=new Array();
  groups[2]=new Array();
  groups[3]=new Array();
  groups[4]=new Array();

  groups[9]=new Array();

// рубли
// по умолчанию
  groups[0][-1]={'RUB': 'рублей', 'USD': 'долларов США', 'EUR': 'евро'};
//исключения
  groups[0][1]={'RUB': 'рубль', 'USD': 'доллар США', 'EUR': 'евро'};
  groups[0][2]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
  groups[0][3]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
  groups[0][4]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};

// тысячи
// по умолчанию
  groups[1][-1]='тысяч';
//исключения
  groups[1][1]='тысяча';
  groups[1][2]='тысячи';
  groups[1][3]='тысячи';
  groups[1][4]='тысячи';

// миллионы
// по умолчанию
  groups[2][-1]='миллионов';
//исключения
  groups[2][1]='миллион';
  groups[2][2]='миллиона';
  groups[2][3]='миллиона';
  groups[2][4]='миллиона';

// миллиарды
// по умолчанию
  groups[3][-1]='миллиардов';
//исключения
  groups[3][1]='миллиард';
  groups[3][2]='миллиарда';
  groups[3][3]='миллиарда';
  groups[3][4]='миллиарда';

// триллионы
// по умолчанию
  groups[4][-1]='триллионов';
//исключения
  groups[4][1]='триллион';
  groups[4][2]='триллиона';
  groups[4][3]='триллиона';
  groups[4][4]='триллиона';

// копейки
// по умолчанию
  groups[9][-1]={'RUB': 'копеек', 'USD': 'центов', 'EUR': 'центов'};
//исключения
  groups[9][1]={'RUB': 'копейка', 'USD': 'цент', 'EUR': 'цент'};
  groups[9][2]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
  groups[9][3]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
  groups[9][4]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};

// цифры и числа
// либо просто строка, либо 4 строки в хэше
  var names=new Array();
  names[1]={0: 'один', 1: 'одна', 2: 'один', 3: 'один', 4: 'один'};
  names[2]={0: 'два', 1: 'две', 2: 'два', 3: 'два', 4: 'два'};
  names[3]='три';
  names[4]='четыре';
  names[5]='пять';
  names[6]='шесть';
  names[7]='семь';
  names[8]='восемь';
  names[9]='девять';
  names[10]='десять';
  names[11]='одиннадцать';
  names[12]='двенадцать';
  names[13]='тринадцать';
  names[14]='четырнадцать';
  names[15]='пятнадцать';
  names[16]='шестнадцать';
  names[17]='семнадцать';
  names[18]='восемнадцать';
  names[19]='девятнадцать';
  names[20]='двадцать';
  names[30]='тридцать';
  names[40]='сорок';
  names[50]='пятьдесят';
  names[60]='шестьдесят';
  names[70]='семьдесят';
  names[80]='восемьдесят';
  names[90]='девяносто';
  names[100]='сто';
  names[200]='двести';
  names[300]='триста';
  names[400]='четыреста';
  names[500]='пятьсот';
  names[600]='шестьсот';
  names[700]='семьсот';
  names[800]='восемьсот';
  names[900]='девятьсот';

  var r='';
  var i,j;

  var y=Math.floor(x);

// если НЕ ноль рублей
  if (y>0)
  {
  // выделим тройки с руб., тыс., миллионами, миллиардами и триллионами
    var t=new Array();

    for (i=0;i<=4;i++)
    {
      t[i]=y%1000;
      y=Math.floor(y/1000);
    }

    var d=new Array();

  // выделим в каждой тройке сотни, десятки и единицы
    for (i=0;i<=4;i++)
    {
      d[i]=new Array();
      d[i][0]=t[i]%10; // единицы
      d[i][10]=t[i]%100-d[i][0]; // десятки
      d[i][100]=t[i]-d[i][10]-d[i][0]; // сотни
      d[i][11]=t[i]%100; // две правых цифры в виде числа
    }

    for (i=4; i>=0; i--)
    {
      if (t[i]>0)
      {
        if (names[d[i][100]])
          r+=' '+ ((typeof(names[d[i][100]])=='object')?(names[d[i][100]][i]):(names[d[i][100]]));

        if (names[d[i][11]])
          r+=' '+ ((typeof(names[d[i][11]])=='object')?(names[d[i][11]][i]):(names[d[i][11]]));
        else
        {
          if (names[d[i][10]]) r+=' '+ ((typeof(names[d[i][10]])=='object')?(names[d[i][10]][i]):(names[d[i][10]]));
          if (names[d[i][0]]) r+=' '+ ((typeof(names[d[i][0]])=='object')?(names[d[i][0]][i]):(names[d[i][0]]));
        }

        if (names[d[i][11]])  // если существует числительное
          j=d[i][11];
        else
          j=d[i][0];

        if (groups[i][j])
        {
          if (i==0)
            r+=' '+groups[i][j][currency];
          else
            r+=' '+groups[i][j];
        }
        else
        {
          if (i==0)
            r+=' '+groups[i][-1][currency];
          else
            r+=' '+groups[i][-1];
        }
      }
    }

    if (t[0]==0)
      r+=' '+groups[0][-1][currency];
  }
  else
    r='Ноль '+groups[0][-1][currency];

  y=((x-Math.floor(x))*100).roundTo();
  if (y<10) y='0'+y;

  r=r.trimMiddle();
  r=r.substr(0,1).toUpperCase()+r.substr(1);
  r+=' '+y;

  y=y*1;

  if (names[y])  // если существует числительное
    j=y;
  else
    j=y%10;

  if (groups[9][j])
    r+=' '+groups[9][j][currency];
  else
    r+=' '+groups[9][-1][currency];

  return r;
}
 
Сообщение
Цитата mishem ()
Накидал до триллионов.

Спасибо, я уже думал использовать JavaScript, только не понял как прикрутить к NB
Код
Number.prototype.toPhrase=function(c)
// сумма прописью для чисел от 0 до 999 триллионов
// можно передать параметр "валюта": RUB,USD,EUR (по умолчанию RUB)
{
  var x=this.roundTo(2);
  if (x<0 || x>999999999999999.99) return false;

  var currency='RUB';
  if (typeof(c)=='string')
    currency=c.trimAll().toUpperCase();

  if (currency=='RUR') currency='RUB';
  if (currency!='RUB' && currency!='USD' && currency!='EUR')
    return false;

  var groups=new Array();

  groups[0]=new Array();
  groups[1]=new Array();
  groups[2]=new Array();
  groups[3]=new Array();
  groups[4]=new Array();

  groups[9]=new Array();

// рубли
// по умолчанию
  groups[0][-1]={'RUB': 'рублей', 'USD': 'долларов США', 'EUR': 'евро'};
//исключения
  groups[0][1]={'RUB': 'рубль', 'USD': 'доллар США', 'EUR': 'евро'};
  groups[0][2]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
  groups[0][3]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};
  groups[0][4]={'RUB': 'рубля', 'USD': 'доллара США', 'EUR': 'евро'};

// тысячи
// по умолчанию
  groups[1][-1]='тысяч';
//исключения
  groups[1][1]='тысяча';
  groups[1][2]='тысячи';
  groups[1][3]='тысячи';
  groups[1][4]='тысячи';

// миллионы
// по умолчанию
  groups[2][-1]='миллионов';
//исключения
  groups[2][1]='миллион';
  groups[2][2]='миллиона';
  groups[2][3]='миллиона';
  groups[2][4]='миллиона';

// миллиарды
// по умолчанию
  groups[3][-1]='миллиардов';
//исключения
  groups[3][1]='миллиард';
  groups[3][2]='миллиарда';
  groups[3][3]='миллиарда';
  groups[3][4]='миллиарда';

// триллионы
// по умолчанию
  groups[4][-1]='триллионов';
//исключения
  groups[4][1]='триллион';
  groups[4][2]='триллиона';
  groups[4][3]='триллиона';
  groups[4][4]='триллиона';

// копейки
// по умолчанию
  groups[9][-1]={'RUB': 'копеек', 'USD': 'центов', 'EUR': 'центов'};
//исключения
  groups[9][1]={'RUB': 'копейка', 'USD': 'цент', 'EUR': 'цент'};
  groups[9][2]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
  groups[9][3]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};
  groups[9][4]={'RUB': 'копейки', 'USD': 'цента', 'EUR': 'цента'};

// цифры и числа
// либо просто строка, либо 4 строки в хэше
  var names=new Array();
  names[1]={0: 'один', 1: 'одна', 2: 'один', 3: 'один', 4: 'один'};
  names[2]={0: 'два', 1: 'две', 2: 'два', 3: 'два', 4: 'два'};
  names[3]='три';
  names[4]='четыре';
  names[5]='пять';
  names[6]='шесть';
  names[7]='семь';
  names[8]='восемь';
  names[9]='девять';
  names[10]='десять';
  names[11]='одиннадцать';
  names[12]='двенадцать';
  names[13]='тринадцать';
  names[14]='четырнадцать';
  names[15]='пятнадцать';
  names[16]='шестнадцать';
  names[17]='семнадцать';
  names[18]='восемнадцать';
  names[19]='девятнадцать';
  names[20]='двадцать';
  names[30]='тридцать';
  names[40]='сорок';
  names[50]='пятьдесят';
  names[60]='шестьдесят';
  names[70]='семьдесят';
  names[80]='восемьдесят';
  names[90]='девяносто';
  names[100]='сто';
  names[200]='двести';
  names[300]='триста';
  names[400]='четыреста';
  names[500]='пятьсот';
  names[600]='шестьсот';
  names[700]='семьсот';
  names[800]='восемьсот';
  names[900]='девятьсот';

  var r='';
  var i,j;

  var y=Math.floor(x);

// если НЕ ноль рублей
  if (y>0)
  {
  // выделим тройки с руб., тыс., миллионами, миллиардами и триллионами
    var t=new Array();

    for (i=0;i<=4;i++)
    {
      t[i]=y%1000;
      y=Math.floor(y/1000);
    }

    var d=new Array();

  // выделим в каждой тройке сотни, десятки и единицы
    for (i=0;i<=4;i++)
    {
      d[i]=new Array();
      d[i][0]=t[i]%10; // единицы
      d[i][10]=t[i]%100-d[i][0]; // десятки
      d[i][100]=t[i]-d[i][10]-d[i][0]; // сотни
      d[i][11]=t[i]%100; // две правых цифры в виде числа
    }

    for (i=4; i>=0; i--)
    {
      if (t[i]>0)
      {
        if (names[d[i][100]])
          r+=' '+ ((typeof(names[d[i][100]])=='object')?(names[d[i][100]][i]):(names[d[i][100]]));

        if (names[d[i][11]])
          r+=' '+ ((typeof(names[d[i][11]])=='object')?(names[d[i][11]][i]):(names[d[i][11]]));
        else
        {
          if (names[d[i][10]]) r+=' '+ ((typeof(names[d[i][10]])=='object')?(names[d[i][10]][i]):(names[d[i][10]]));
          if (names[d[i][0]]) r+=' '+ ((typeof(names[d[i][0]])=='object')?(names[d[i][0]][i]):(names[d[i][0]]));
        }

        if (names[d[i][11]])  // если существует числительное
          j=d[i][11];
        else
          j=d[i][0];

        if (groups[i][j])
        {
          if (i==0)
            r+=' '+groups[i][j][currency];
          else
            r+=' '+groups[i][j];
        }
        else
        {
          if (i==0)
            r+=' '+groups[i][-1][currency];
          else
            r+=' '+groups[i][-1];
        }
      }
    }

    if (t[0]==0)
      r+=' '+groups[0][-1][currency];
  }
  else
    r='Ноль '+groups[0][-1][currency];

  y=((x-Math.floor(x))*100).roundTo();
  if (y<10) y='0'+y;

  r=r.trimMiddle();
  r=r.substr(0,1).toUpperCase()+r.substr(1);
  r+=' '+y;

  y=y*1;

  if (names[y])  // если существует числительное
    j=y;
  else
    j=y%10;

  if (groups[9][j])
    r+=' '+groups[9][j][currency];
  else
    r+=' '+groups[9][-1][currency];

  return r;
}

Автор - Negibo
Дата добавления - 17 Августа 2016 в 19:42
AS3856Дата: Ср, 21 Июня 2017, 19:09 | Сообщение # 10
Участник
добавлю копейку в копилку в виде функции.выдаёт число прописью. скрипт где то выдрал с просторов инета(идёт как функция в эксель), убрал лишнее,дописал немного. Определяет нормально до 20 миллиардов. Зачем надо больше- ума неприложу
Возможно писать с десятичной дробью, определятья будет только целая часть.В архиве пример,функция.
Прикрепления: 6218973.rar(3Kb)
 
Сообщениедобавлю копейку в копилку в виде функции.выдаёт число прописью. скрипт где то выдрал с просторов инета(идёт как функция в эксель), убрал лишнее,дописал немного. Определяет нормально до 20 миллиардов. Зачем надо больше- ума неприложу
Возможно писать с десятичной дробью, определятья будет только целая часть.В архиве пример,функция.

Автор - AS3856
Дата добавления - 21 Июня 2017 в 19:09
ВадимДата: Сб, 24 Июня 2017, 15:16 | Сообщение # 11
Генератор идей
Прикольно! thumbs_up

Но, видимо, надо допилить. Нашел неверную подстановку:
Прикрепления: 2386114.png(5Kb)


С уважением, Вадим
Win7x32, NB5.8.7, NeoBookDBPro1.6a, FF48, IE11
Мои материалы для начинающих необукеров
 
СообщениеПрикольно! thumbs_up

Но, видимо, надо допилить. Нашел неверную подстановку:

Автор - Вадим
Дата добавления - 24 Июня 2017 в 15:16
Форум NeoBook » Всё о программе NeoBook » Сценарии и скриптовые языки в Neobook » Сумма прописью (Вывод суммы прописью)
Страница 1 из 11
Поиск: