Author: Jonas Bilinkevicius
How can I convert a value like $ 405.00 into a string?
Answer:
Solve 1:
I have written a function similar to what you want, but some modification need to
be done. CurrToStrFunc(1234.56, 'Dollar', 'Cent');
1 unit CurrToStrProc;
2
3 interface
4
5 uses
6 SysUtils;
7
8 function CurrToStrFunc(InputCur: Currency; InputDollar: string; InputCent: string):
9 string;
10 function Length_1(InputString: string): string;
11 function Length_2(InputString: string): string;
12 function Length_3(InputString: string): string;
13 function Length_4(InputString: string): string;
14 function Length_5(InputString: string): string;
15 function Length_6(InputString: string): string;
16 function Length_7(InputString: string): string;
17 function Length_8(InputString: string): string;
18 function Length_9(InputString: string): string;
19
20 implementation
21
22 function CurrToStrFunc(InputCur: Currency; InputDollar: string; InputCent: string):
23 string;
24 var
25 InputStr, DollarValue, DollarStr, CentValue, CentStr: string;
26 Counter, CentCounter: Integer;
27 CentFlag: Boolean;
28 begin
29 InputStr := CurrToStr(InputCur);
30 DollarValue := '';
31 DollarStr := '';
32 CentValue := '';
33 CentStr := '';
34 CentCounter := 0;
35 CentFlag := False;
36 for Counter := 1 to StrLen(PChar(InputStr)) do
37 begin
38 if (InputStr[Counter] <> '.') and (CentFlag = False) then
39 DollarValue := DollarValue + InputStr[Counter]
40 else
41 begin
42 if (InputStr[Counter] <> '.') then
43 begin
44 if (CentCounter < 2) then
45 CentValue := CentValue + InputStr[Counter];
46 CentCounter := CentCounter + 1;
47 end;
48 CentFlag := True;
49 end;
50 end;
51 if (CentCounter = 1) then
52 CentValue := CentValue + '0';
53 case StrLen(PChar(DollarValue)) of
54 0: DollarStr := '';
55 1: DollarStr := Length_1(DollarValue);
56 2: DollarStr := Length_2(DollarValue);
57 3: DollarStr := Length_3(DollarValue);
58 4: DollarStr := Length_4(DollarValue);
59 5: DollarStr := Length_5(DollarValue);
60 6: DollarStr := Length_6(DollarValue);
61 7: DollarStr := Length_7(DollarValue);
62 8: DollarStr := Length_8(DollarValue);
63 9: DollarStr := Length_9(DollarValue);
64 else
65 DollarStr := '?';
66 end;
67 if (CentFlag = True) then
68 CentStr := Length_2(CentValue);
69 if (InputDollar = '') then
70 begin
71 if (InputCent = '') then
72 begin
73 if (CentFlag = True) then
74 Result := DollarStr + ' ' + CentStr + ' ' + 'Only'
75 else
76 Result := DollarStr + ' ' + 'Only';
77 end
78 else if (CentFlag = True) then
79 Result := DollarStr + ' ' + InputCent + ' ' + CentStr + ' ' + 'Only'
80 else
81 Result := DollarStr + ' ' + 'Only';
82 end
83 else
84 begin
85 if (InputCent = '') then
86 begin
87 if (CentFlag = True) then
88 Result := InputDollar + ' ' + DollarStr + ' ' + CentStr + ' ' + 'Only'
89 else
90 Result := InputDollar + ' ' + DollarStr + ' ' + 'Only';
91 end
92 else if (CentFlag = True) then
93 Result := InputDollar + ' ' + DollarStr + ' ' + InputCent + ' ' + CentStr +
94 ' ' + 'Only'
95 else
96 Result := InputDollar + ' ' + DollarStr + ' ' + 'Only';
97 end;
98 end;
99
100 function Length_1(InputString: string): string;
101 begin
102 case StrToInt(InputString) of
103 1: Result := 'One';
104 2: Result := 'Two';
105 3: Result := 'Three';
106 4: Result := 'Four';
107 5: Result := 'Five';
108 6: Result := 'Six';
109 7: Result := 'Seven';
110 8: Result := 'Eight';
111 9: Result := 'Nine';
112 end;
113 end;
114
115 function Length_2(InputString: string): string;
116 begin
117 case StrToInt(InputString[1]) of
118 0:
119 begin
120 Result := Length_1(InputString[2])
121 end;
122 1:
123 begin
124 case StrToInt(InputString[2]) of
125 0: Result := 'Ten';
126 1: Result := 'Eleven';
127 2: Result := 'Twelve';
128 3: Result := 'Thirteen';
129 4: Result := 'Fourteen';
130 5: Result := 'Fiveteen';
131 6: Result := 'Sixteen';
132 7: Result := 'Seventeen';
133 8: Result := 'Eighteen';
134 9: Result := 'Nineteen';
135 end;
136 end;
137 2:
138 begin
139 if (InputString[2] = '0') then
140 Result := 'Twenty'
141 else
142 Result := 'Twenty' + ' ' + Length_1(InputString[2])
143 end;
144 3:
145 begin
146 if (InputString[2] = '0') then
147 Result := 'Thirty'
148 else
149 Result := 'Thirty' + ' ' + Length_1(InputString[2])
150 end;
151 4:
152 begin
153 if (InputString[2] = '0') then
154 Result := 'Fourty'
155 else
156 Result := 'Fourty' + ' ' + Length_1(InputString[2])
157 end;
158 5:
159 begin
160 if (InputString[2] = '0') then
161 Result := 'Fivety'
162 else
163 Result := 'Fivety' + ' ' + Length_1(InputString[2])
164 end;
165 6:
166 begin
167 if (InputString[2] = '0') then
168 Result := 'Sixty'
169 else
170 Result := 'Sixty' + ' ' + Length_1(InputString[2])
171 end;
172 7:
173 begin
174 if (InputString[2] = '0') then
175 Result := 'Seventy'
176 else
177 Result := 'Seventy' + ' ' + Length_1(InputString[2])
178 end;
179 8:
180 begin
181 if (InputString[2] = '0') then
182 Result := 'Eighty'
183 else
184 Result := 'Eighty' + ' ' + Length_1(InputString[2])
185 end;
186 9:
187 begin
188 if (InputString[2] = '0') then
189 Result := 'Ninety'
190 else
191 Result := 'Ninety' + ' ' + Length_1(InputString[2])
192 end;
193 end;
194 end;
195
196 function Length_3(InputString: string): string;
197 begin
198 if (Copy(InputString, 1, 2) = '00') then
199 Result := Length_1(InputString[3])
200 else if (Copy(InputString, 2, 2) = '00') then
201 Result := Length_1(InputString[1]) + ' ' + 'Hundred'
202 else if (Copy(InputString, 1, 1) = '0') then
203 Result := Length_2(Copy(InputString, 2, 2))
204 else
205 Result := Length_1(InputString[1]) + ' ' + 'Hundred' + ' ' +
206 Length_2(Copy(InputString, 2, 2));
207 end;
208
209 function Length_4(InputString: string): string;
210 begin
211 if (Copy(InputString, 2, 3) = '000') then
212 Result := Length_1(InputString[1]) + ' ' + 'Thousand'
213 else if (InputString[2] = '0') then
214 Result := Length_1(InputString[1]) + ' ' + 'Thousand' + ' ' +
215 Length_2(Copy(InputString, 3, 2))
216 else
217 Result := Length_1(InputString[1]) + ' ' + 'Thousand' + ' ' +
218 Length_1(InputString[2]) + ' ' + 'Hundred' + ' ' + Length_2(Copy(InputString,
219 3,
220 2));
221 end;
222
223 function Length_5(InputString: string): string;
224 begin
225 if (Copy(InputString, 2, 4) = '0000') then
226 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Thousand'
227 else if (InputString[3] = '0') then
228 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Thousand' + ' ' +
229 Length_2(Copy(InputString, 4, 2))
230 else
231 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Thousand' + ' ' +
232 Length_1(InputString[3]) + ' ' + 'Hundred' + ' ' + Length_2(Copy(InputString,
233 4,
234 2));
235 end;
236
237 function Length_6(InputString: string): string;
238 begin
239 if (Copy(InputString, 1, 3) = '000') then
240 Result := Length_3(Copy(InputString, 4, 3))
241 else if (Copy(InputString, 2, 5) = '00000') then
242 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Thousand'
243 else if (InputString[4] = '0') then
244 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Thousand' + ' ' +
245 Length_2(Copy(InputString, 5, 2))
246 else
247 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Thousand' + ' ' +
248 Length_1(InputString[4]) + ' ' + 'Hundred' + ' ' + Length_2(Copy(InputString,
249 5,
250 2));
251 end;
252
253 function Length_7(InputString: string): string;
254 begin
255 if (Copy(InputString, 2, 6) = '000000') then
256 Result := Length_1(InputString[1]) + ' ' + 'Million'
257 else if (Copy(InputString, 2, 3) = '000') then
258 Result := Length_1(InputString[1]) + ' ' + 'Million' + ' ' +
259 Length_3(Copy(InputString, 5, 3))
260 else
261 Result := Length_1(InputString[1]) + ' ' + 'Million' + ' ' +
262 Length_6(Copy(InputString, 2, 6));
263 end;
264
265 function Length_8(InputString: string): string;
266 begin
267 if (Copy(InputString, 2, 7) = '0000000') then
268 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Million'
269 else if (Copy(InputString, 3, 3) = '000') then
270 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Million' + ' ' +
271 Length_3(Copy(InputString, 6, 3))
272 else
273 Result := Length_2(Copy(InputString, 1, 2)) + ' ' + 'Million' + ' ' +
274 Length_6(Copy(InputString, 3, 6));
275 end;
276
277 function Length_9(InputString: string): string;
278 begin
279 if (Copy(InputString, 2, 8) = '00000000') then
280 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Million'
281 else if (Copy(InputString, 7, 3) = '000') then
282 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Million' + ' ' +
283 Length_3(Copy(InputString, 7, 3))
284 else
285 Result := Length_3(Copy(InputString, 1, 3)) + ' ' + 'Million' + ' ' +
286 Length_6(Copy(InputString, 4, 6));
287 end;
288
289 end.
Solve 2:
290 CurrencyToString(const Value: Double): string;
291 function IntToEnglish(const Value: LongInt): string;
292
293 implementation
294
295 uses
296 Math;
297
298 const
299 ENGLISH_ONES: array[1..19] of string = (
300 'one',
301 'two',
302 'three',
303 'four',
304 'five',
305 'six',
306 'seven',
307 'eight',
308 'nine',
309 'ten',
310 'eleven',
311 'twelve',
312 'thirteen',
313 'fourteen',
314 'fifteen',
315 'sixteen',
316 'seventeen',
317 'eighteen',
318 'nineteen');
319
320 ENGLISH_TENS: array[1..9] of string = (
321 'ten',
322 'twenty',
323 'thirty',
324 'forty',
325 'fifty',
326 'sixty',
327 'seventy',
328 'eighty',
329 'ninety');
330
331 ENGLISH_GROUP_SUFFIXES: array[1..3] of string = (
332 'thousand',
333 'million',
334 'billion');
335
336 function CurrencyToString(const Value: Double): string;
337 var
338 Cents: LongInt;
339 begin
340 Cents := Round(Value * 100);
341 Result := IntToEnglish(Cents div 100) + ' and ' + IntToStr(Cents mod 100) +
342 '/100 dollars';
343 end;
344
345 function IntToEnglish(const Value: LongInt): string;
346 var
347 GroupIndex: Integer;
348 GroupValue: Integer;
349 begin
350 if (Value = 0) then
351 Result := 'zero'
352 else if (Value < 0) then
353 Result := 'negative ' + IntToEnglish(-Value)
354 else
355 begin
356 Result := '';
357 for GroupIndex := (Trunc((8 * SizeOf(Value) - 1) / (3 * Ln(10) / Ln(2))))
358 downto 0
359 do
360 begin
361 GroupValue := Value div Round(IntPower(10, 3 * GroupIndex)) mod 1000;
362 if (GroupValue > 0) then
363 begin
364 if (GroupValue div 100 > 0) then
365 Result := Result + ENGLISH_ONES[GroupValue div 100] + ' hundred';
366 case (GroupValue mod 100) of
367 0: ;
368 1..19:
369 Result := Result + ENGLISH_ONES[GroupValue mod 100] + ' ';
370 else
371 begin
372 Result := Result + ENGLISH_TENS[GroupValue div 10 mod 10];
373 if (GroupValue mod 10 > 0) then
374 Result := Result + '-' + ENGLISH_ONES[GroupValue mod 10];
375 Result := Result + ' ';
376 end;
377 end;
378 if (GroupIndex > 0) then
379 Result := Result + ENGLISH_GROUP_SUFFIXES[GroupIndex] + ' ';
380 end;
381 end;
382 SetLength(Result, Length(Result) - 1); {Remove the trailing space}
383 end;
384 end;
Calling CurrencyToString(12345678.90) returns: 'twelve million three hundred forty-five thousand six hundred seventy-eight and 90/100 dollars'
|