Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 25, 2007 16:57:14

frutik
От:
Зарегистрирован: 2007-10-25
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

разбиение числа на порядки для проговоаривания

нужна идея как правильно разбить произвольное число на количество тысяч, сотен, десятков, единиц с учетом возможных вариантов и форм (тысяча/тысячи/тысяч и т,д) для дальнейшего формирования голосового файла из соответствующих кусков (хотя это не столь важно)

есть несколько глупых идей - ифами описать все возможные варианты. но, возможно, существует другое, более правиотное решение? подскажите с какой стороні подойти к вопросу правильно.



Отредактировано (Окт. 25, 2007 16:59:40)

Офлайн

#2 Окт. 25, 2007 17:46:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

разбиение числа на порядки для проговоаривания

где-то в этом форуме уже такое было



Офлайн

#3 Окт. 25, 2007 17:52:26

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

разбиение числа на порядки для проговоаривания

Словарями и регулярными выражениями можно.

Отредактировано (Окт. 25, 2007 17:53:16)

Офлайн

#4 Окт. 25, 2007 18:27:50

ponyol
От:
Зарегистрирован: 2007-10-25
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

разбиение числа на порядки для проговоаривания

вот код паскаля, думаю перевести на питон проблемы не будет :)

Function SumToStr(Sum:String):String;
label fin,fik;
var M:Word;
temp,S,fl,dg,sd: string;
begin
S:=Sum;
M:=pos('.',s); dg:=s;fl:='';
if M<>0 then begin fl:=copy(s,M+1,Length(s));dg:=copy(s,1,M-1);end
else
begin
M:=pos(',',s);
if M<>0 then begin fl:=copy(s,M+1,Length(s));dg:=copy(s,1,M-1);end;
end;

if fl='' then fl:='00 ';
if (dg='')or(dg='0') then goto fin;

sd:='';M:=0;s:='';
While length(dg)>0 do
begin
if (length(dg) mod 3)=0 then
begin
case dg[1] of
'1': sd:=sd+'сто ';
'2': sd:=sd+'двісті ';
'3': sd:=sd+'триста ';
'4': sd:=sd+'чотириста ';
'5': sd:=sd+'п''ятсот ';
'6': sd:=sd+'шістсот ';
'7': sd:=sd+'сімсот ';
'8': sd:=sd+'вісімсот ';
'9': sd:=sd+'дев''ятсот ';
'0': inc(M);
end;s:=s+dg[1];dg:=copy(dg,2,length(dg));
end else
if (length(dg)=8)or(length(dg)=5)or(length(dg)=2) then
begin
if dg[1]='1' then
begin
case dg[2] of
'0': sd:=sd+'десять ';
'1': sd:=sd+'одинадцять ';
'2': sd:=sd+'дванадцять ';
'3': sd:=sd+'тринадцять ';
'4': sd:=sd+'чотирнадцять ';
'5': sd:=sd+'п''ятнадцять ';
'6': sd:=sd+'шістнадцять ';
'7': sd:=sd+'сімнадцять ';
'8': sd:=sd+'вісімнадцять ';
'9': sd:=sd+'дев''ятнадцять ';
end;
s:=s+dg[1]+dg[2];
if length(dg)=2 then begin dg:='9';goto fik;end;
dg:='9'+copy(dg,3,length(dg));goto fik;
end else
begin
case dg[1] of
'2': sd:=sd+'двадцять ';
'3': sd:=sd+'тридцять ';
'4': sd:=sd+'сорок ';
'5': sd:=sd+'п''ятдесят ';
'6': sd:=sd+'шістдесят ';
'7': sd:=sd+'сімдесят ';
'8': sd:=sd+'вісімдесят ';
'9': sd:=sd+'дев''яносто ';
'0': inc(M);
end;
s:=s+dg[1];
dg:=copy(dg,2,length(dg));
end;
end else
begin
case dg[1] of
'1': if (length(dg)-1)<>6 then sd:=sd+'одна ' else sd:=sd+'один ';
'2': sd:=sd+'дві ';
'3': sd:=sd+'три ';
'4': sd:=sd+'чотири ';
'5': sd:=sd+'п''ять ';
'6': sd:=sd+'шість ';
'7': sd:=sd+'сім ';
'8': sd:=sd+'вісім ';
'9': sd:=sd+'дев''ять ';
'0': inc(M);
end;
s:=s+dg[1];
fik: if (dg='')or((length(dg)-1)=0) then
begin
case dg[1] of
'1' : sd:=sd+'гривня ';
'2'..'4' : sd:=sd+'гривні ';
else sd:=sd+'гривень ';
end;
dg:='';s:=s+','+fl;
end else
if (length(dg)-1)=3 then
begin
case dg[1] of
'1' : sd:=sd+'тисяча ';
'2'..'4' : sd:=sd+'тисячі ';
else if M<>3 then sd:=sd+'тисяч ';
end;
dg:=copy(dg,2,length(dg));s:=s+'.';
end else
if (length(dg)-1)=6 then
begin
case dg[1] of
'1' : sd:=sd+'мільйон ';
'2'..'4' : sd:=sd+'мільйона ';
else sd:=sd+'мільйонів ';
end;
dg:=copy(dg,2,length(dg));s:=s+'.';
end else dg:=copy(dg,2,length(dg));
end;
end;
fin:
If Length(fl) < 2 then fl:=fl+'0';
Temp:=Sd[1];
Temp:=AnsiUpperCase(Temp);
Sd[1]:=Temp[1];
Result:=sd+fl+' коп.';
end;



Офлайн

#5 Окт. 25, 2007 22:10:19

frutik
От:
Зарегистрирован: 2007-10-25
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

разбиение числа на порядки для проговоаривания

ponyol

большое спасибо.

пока сам родил такое

#!/usr/bin/python

import sys

def say_token(token):
say=[]

if token <> []:
token.reverse()

t2 = token
t1 = token[1:3]
t0 = token[2:3]

t2 = int(str(t2[0]) + '0'*2)
t1 = int(str(t1[0]) + '0'*1)
t0 = int(t0[0])

if t2 > 0:
say.append(str(t2))

tmp = t0 + t1

if tmp > 10 and tmp < 20:
say.append(str(tmp))
else:
if t1 > 0:
say.append(str(t1))

if t0 > 0:
say.append(str(t0))

return say

a=sys.argv[1]

a=str(a)

a = '0'*(12 - len(a)) + a

b=list(a)

b.reverse()

c = ''.join(b)

tokens = {0:list(c[0:3]), 1:list(c[3:6]), 2:list(c[6:9]), 3:list(c[9:12])}

suffix = {0:'', 1:'tysach', 2:'milyonov', 3:'milyardov'}

words = []

for i in tokens:
say = say_token(tokens[i])

if say <> []:
if suffix[i] <> '':
say.append(suffix[i])

words.append(say)

words.reverse()

print words
andriy@smola:~$ ./asterisk.py 11111223145465
[['100', '11', 'milyardov'], ['200', '20', '3', 'milyonov'], ['100', '40', '5', 'tysach'], ['400', '60', '5']]
не пинайте сильно - лучше посоветуйте что-то. в питоне я чуть меньше чем ноль



Отредактировано (Окт. 25, 2007 22:23:49)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version