Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.52 MB
Время: 0.014 c
2-1140617393
LordOfRock
2006-02-22 17:09
2006.03.12
Классы. Удаление "самого себя"


2-1140779871
Saveliy
2006-02-24 14:17
2006.03.12
Соединение с интернетом


2-1140519256
BillyJeans
2006-02-21 13:54
2006.03.12
Вопрос по ADOQuery


1-1139120377
!Trinix
2006-02-05 09:19
2006.03.12
Картинку в RichEdit


4-1134982464
Chaser
2005-12-19 11:54
2006.03.12
При закрытии программы - минимизация в трей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский