Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Внизпреобразование числа в строку Найти похожие ветки
← →
Korefey © (2006-02-21 17:07) [0]Подскажите пожалуйста как в Делфи преобразовать число 34 в строку тридцать четыре ?
← →
Чародей © (2006-02-21 17:19) [1]http://kladovka.net.ru/delphibase/?action=viewfunc&topic=strchange&id=10510
← →
Rule © (2006-02-21 17:20) [2]unit sumstr;
interface
uses
SysUtils, StrUtils;
function SumToString(Value: string): string;
implementation
const
a: array[0..8,0..9] of string=(
("","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять "),
("","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "),
("","сто ","двести ","триста ","четыреста ","пятьсот ","шестьсот ","семьсот ","восемьсот ","девятьсот "),
("тысяч ","тысяча ","две тысячи ","три тысячи ","четыре тысячи ","пять тысячь ","шесть тысячь ","семь тысячь ",
"восемь тысячь ","девять тысячь "),
("","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "),
("","сто ","двести ","триста ","четыреста ","пятьсот ","шестьсот ","семьсот ","восемьсот ","девятьсот "),
("миллионов ","один миллион ","два миллиона ","три миллиона ","четыре миллиона ","пять миллионов ",
"шесть миллионов ","семь миллионов ","восемь миллионов ","девять миллионов "),
("","","двадцать ","тридцать ","сорок ","пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "),
("","сто ","двести ","триста ","четыреста ","пятьсот ","шестьсот ","семьсот ","восемьсот ","девятьсот "));
b: array[0..9] of string=
("десять ","одинадцать ","двенадцать ","тринадцать ","четырнадцать ","пятьнадцать ","шестьнадцать ",
"семьнадцать ","восемьнадцать ","девятьнадцать ");
function SumToStrin(Value: string): string;
var
s, t: string;
p, pp, i, k: integer;
begin
s:=value;
if s="0" then
t:="Ноль "
else
begin
p:=length(s);
pp:=p;
if p>1 then
if (s[p-1]="1") and (s[p]>"0") then
begin
t:=b[strtoint(s[p])];
pp:=pp-2;
end;
i:=pp;
while i>0 do
begin
if (i=p-3) and (p>4) then
if s[p-4]="1" then
begin
t:=b[strtoint(s[p-3])]+"тысяч "+t;
i:=i-2;
end;
if (i=p-6) and (p>7) then
if s[p-7]="1" then
begin
t:=b[strtoint(s[p-6])]+"миллионов "+t;
i:=i-2;
end;
if i>0 then
begin
k:=strtoint(s[i]);
t:=a[p-i,k]+t;
i:=i-1;
end;
end;
end;
result:=t;
end;
procedure get2str(value: string; var hi, lo: string);
var
p: integer;
begin
p:=pos(",", value);
lo:="";
hi:="";
if p=0 then
p:=pos(".", value);
if p<>0 then
delete(value,p,1);
if p=0 then
begin
hi:=value;
lo:="00";
end;
if p>length(value) then
begin
hi:=value;
lo:="00";
end;
if p=1 then
begin
hi:="0";
lo:=value;
end;
if (p>1) and (p then
begin
hi:=copy(value,1,p-1);
lo:=copy(value,p,length(value));
end;
end;
function sumtostring(value: string): string;
var
hi, lo: string;
pr, er: integer;
begin
get2str(value,hi,lo);
if (hi="") or (lo="") then
begin
result:="";
exit;
end;
val(hi,pr,er);
if er<>0 then
begin
result:="";
exit;
end;
hi:=sumtostrin(inttostr(pr))+"руб. ";
if lo<>"00" then
begin
val(lo,pr,er);
if er<>0 then
begin
result:="";
exit;
end;
lo:=inttostr(pr);
end;
lo:=lo+" коп. ";
hi[1]:=AnsiUpperCase(hi[1])[1];
result:=hi+lo;
end;
end.
← →
PZ (2006-02-21 17:20) [3]Посмотрите
http://www.delphikingdom.com/asp/itemq.asp?Mode=1&ItemID=431
← →
Rule © (2006-02-21 17:21) [4]мне известно ещё 15 таких методов только из делфиворлд, еслинтересно поспотреть на другие смотри тама
← →
Ega23 © (2006-02-21 17:40) [5]Есть функция, но она для денег. В смысле, рубли и копейки выдаёт.
Если надо - могу выложить.
← →
Crash Coredump © (2006-02-21 17:48) [6]а наоборот слабо ? из тридцать четыре в 34 ?
← →
Compton's G © (2006-02-21 18:06) [7]IntToStr
:))))))))))))))))))))
← →
PZ (2006-02-21 19:04) [8]> Crash Coredump © (21.02.06 17:48) [6]
> а наоборот слабо ? из тридцать четыре в 34 ?
Const
Decat : Array[1..9] of String = ("десять","двадцать","тридцать","сорок",
"пятьдесят","шестьдесят","семьдесят",
"восемьдесят","девяносто");
Edin : Array[1..9] of String = ("один","два","три","четыре",
"пять","шесть","семь",
"восемь","девять");
S = "тридцать четыре";
Var
S1, S2 : String;
procedure TForm1.Button1Click(Sender: TObject);
Var
P, I : Integer;
D, E : Integer;
begin
P := Pos(" ", S);
S1 := Copy(S, 1, P-1);
S2 := Copy(S, P+1, Length(S)-P);
For I := 1 to 9 do
begin
If S1 = Decat[I] then D := I*10;
If S2 = Edin[I] then E := I;
end;
Edit1.Text := S;
Edit2.Text := IntToStr(D+E);
end;
← →
Leonid Troyanovsky © (2006-02-21 19:30) [9]
> Rule © (21.02.06 17:20) [2]
> "пятьнадцать ","шестьнадцать ",
> "семьнадцать ","восемьнадцать ","девятьнадцать "
Сколко-сколко?
--
Regards, LVT.
← →
34 (2006-02-21 19:59) [10]преобразование числа в строку
см. [7]
как в Делфи преобразовать число 34 в строку тридцать четыре
function Convert34(aValue: integer): string;
begin
ASSERT(aValue = 34, "Convert34: Invalid argument """ + IntToStr(aValue) + """");
Result := "тридцать четыре";
end;
← →
unknown © (2006-02-21 20:51) [11]>34 (21.02.06 19:59) [10]
А если надо будет и 12 и 15 и ... N записать строкой?
Copy->Paste и вперед?
Круто :))
← →
Игорь Шевченко © (2006-02-21 21:08) [12]PZ (21.02.06 19:04) [8]
Тема партии не раскрыта. Зачем нужен элемент массива "десять" ? :)
Rule © (21.02.06 17:20) [2]
Пять тысячъ, шесть тысячъ, семь тысячъ, восемь тысячъ, ...
← →
TStas © (2006-02-21 21:30) [13]http://stas258.narod.ru/frame/download/spelling.zip
← →
Dmitrij_K (2006-02-21 22:13) [14]+ http://acedutils.narod.ru/
Ж)
← →
34 (2006-02-21 22:33) [15]А если надо будет и 12 и 15 и ... N записать строкой?
Вот если надо будет - тогда и спросит. А пока - только 34. :)
Или я неправильно ответил на поставленный вопрос?
← →
PZ (2006-02-22 08:51) [16]> Игорь Шевченко © (21.02.06 21:08) [12]
> Тема партии не раскрыта. Зачем нужен элемент массива "десять" ? :)
Это всего лишь пример.
← →
konrads (2006-02-22 10:30) [17]по этой теме нужно соревнование устроить, у кого функция получилась короче :)
← →
konrads (2006-02-22 12:53) [18]Мой вариант такой
function TForm1.IntToTxt(Int: String): String;
// Функция превода положительных целых чисел любой величины в прописной формат.
const EDIN : array [0..12] of String[6] =
("","один","два","три","четыре","пять","шесть","семь","восемь","девять","десять" ,"одна","две");
OKON : array [1..2, 1..3] of String[2] = (("а","и",""),("","а","ов"));
DES : array [0..19] of String[20] = ("","десять","двадцать","тридцать",
"сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят", "девяносто",
"","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
"шестнадцать","семнадцать","восемнадцать","девятнадцать");
SOT : array [0..9] of String[10] = ("","сто","двести","триста","четыреста",
"пятьсот","шестьсот","семьсот","восемьсот","девятьсот");
var l,l1,l2,l3 : integer;
f : boolean;
s,s1 : string;
begin
if int[1] = "0" then begin
// result := "Ноль рублей";
result := "Ноль";
exit;
end;
f := true;
s := "";
l := length(Int);
{
if Int[length(Int)-1] = "1" then s1 := "рублей" else
case Int[length(Int)] of
"1" : s1 := "рубль";
"2".."4" : s1 := "рубля";
else s1 := "рублей";
end;
}
while l > 0 do begin
l := length(int);
l3 := l mod 3;
if l3 = 0 then l3 := 3;
case l3 of
1: if Int[1] <> "0" then f := true else f := false;
2: if copy(Int,1,2) <> "00" then f := true else f := false;
3: if copy(Int,1,3) <> "000" then f := true else f := false;
end;
while l3 > 0 do begin
l := length(Int);
l1 := l mod 3;
l2 := StrToInt(Int[1]);
if (l > 3) and (l < 7) and ((l2 = 1) or (l2 = 2)) and (l1 = 1) then l2 := l2 + 10;
if (l1 = 2) and (l2 = 1) and (Int[2] <> "0") then begin
l2 := 10 + StrToInt(Int[2]);
Int := copy(Int,2,length(Int) - 1);
dec(l3);
end;
case l1 of
0: s := s + SOT[l2];
1: s := s + EDIN[l2];
2: s := s + DES[l2];
end;
if (l2 > 9) and (l1 = 2) then l2 := 5;
if l2 > 9 then l2 := l2 - 10;
case l2 of
1 : l2 := 1;
2..4: l2 := 2;
else l2 := 3;
end;
Dec(l3);
Int := Copy(Int, 2, length(Int) - 1);
s := s + " ";
end;
s := s + " ";
if f then
// В этом CASE можно добавлять всякие квинтилионы до опупения
// но думаю врядли кому даже триллионы понадобятся
case l of
4..6: s := s + "тысяч" + OKON[1, l2];
7..9: s := s + "миллион" + OKON[2, l2];
10..12: s := s + "миллиард" + OKON[2, l2];
13..15: s := s + "триллион" + OKON[2, l2];
end;
s := s + " ";
l := length(int);
end;
result := s + s1;
// Уберём возможные двойные тройные пробелы между словами
l1 := Length(result); l := 1;
while l <> l1 do
if (result[l] = " ") and (result[l + 1] = " ") then begin
Delete(result, l, 1);
l1 := Length(result);
end else begin
Inc(l);
end;
// Первое слово с большой
if Length(result) > 0 then result[1] := chr(ord(result[1])-32);
end;
Если коментарии не считать, и каждую константу за одну строку - кто короче?
← →
Konrads (2006-02-22 16:49) [19]похоже побеждаю !!!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.013 c