source: trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab@ 457

Last change on this file since 457 was 457, checked in by イグトランス (egtra), 16 years ago

(SPrintF.ab) FormatIntegerExにStringBuilderを引数に取る版を追加。

File size: 39.6 KB
Line 
1'Classes/ActiveBasic/Strings/SPrintF.ab
2
3Namespace ActiveBasic
4Namespace Strings
5
6Namespace Detail
7
8/*!
9@brief 浮動小数点数を文字列化する低水準な関数。符号、指数、仮数に分けて出力。
10@author Egtra
11@date 2007/09/18
12@param[in] x 文字列化する浮動小数点数
13@param[out] e 指数
14@param[out] sign 符号
15@return 仮数
16仮数は1の位から下へ17桁で、小数点を含まない。そのため、誤差を無視すればVal(仮数) * 10 ^ (e - 17) = Abs(x)が成り立つ。
17
18xに無限大、非数を渡した場合の動作は未定義。
19*/
20Function FloatToChars(x As Double, ByRef e As Long, ByRef sign As Boolean) As String
21 Imports System
22
23 '0を弾く
24 If x = 0 Then
25 If GetQWord(VarPtr(x) As *QWord) And &h8000000000000000 Then
26 sign = True
27 Else
28 sign = False
29 End If
30
31 e = 0
32 FloatToChars = "00000000000000000"
33 Exit Function
34 End If
35
36 '符号の判断(同時に符号を取り除く)
37 If x < 0 Then
38 sign = True
39 x = -x
40 Else
41 sign = False
42 End If
43
44 '1e16 <= x < 1e17へ正規化
45 '(元のx) = (正規化後のx) ^ (d - 17)である。
46 Dim d = Math.Floor(Math.Log10(x)) As Long
47 If d < 16 Then
48 x *= ipow(10, +17 - d)
49 ElseIf d > 16 Then
50 x /= ipow(10, -17 + d)
51 End If
52
53 '補正
54 While x < 1e16
55 x *= 10
56 d--
57 Wend
58 While x >= 1e17
59 x /= 10
60 d++
61 Wend
62
63 d--
64 e = d
65
66 FloatToChars = FormatIntegerLU((x As Int64) As QWord, 17, 0, None)
67End Function
68
69/*!
70@brief 書式化関数群で使用するフラグ。
71@author Egtra
72@date 2007/09/18
73*/
74Const Enum FormatFlags
75 '! 何も指定がない。
76 None = &h0
77 /*!
78 符号、+。符号付変換[diAaEeFfGg]のとき、正の値でも符号を付ける。
79 AdjustFieldWidthの仕様から、Format関数郡内からAdjustFieldWidthにかけて、
80 単に数値が符号付である(負の値である)ことを示す意味でも用いられる。
81 */
82 Sign = &h1
83 /*! 空白、空白文字。
84 符号付変換[diAaEeFfGg]のとき、正の値ならば符号分の空白を開ける。Signが立っているときには無視される。
85 */
86 Blank = &h2
87 /*! ゼロ、0。
88 [diouXxAaEeFfGg]で、フィールドの空きを0で埋める。leftが立っているときには無視される。
89 */
90 Zero = &h4
91 '! 左揃え、-。フィールド内で左揃えにする。
92 LeftSide = &h8
93 /*! 代替表記、#。
94 <ul>
95 <li>[OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul>
96 <li>[AaEeFfGg]では、精度0でも小数点を付ける。</ul>
97 <li>[Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul>
98 </ul>
99 */
100 Alt = &h10
101 '! 大文字。使用するアルファベットを大文字にする。[aefgx]を[AEFGX]化する。
102 Cap = &h20
103
104 '!BASIC接頭辞。&h, &oなど。
105 BPrefix = &h40
106
107 /*!
108 内部処理用に予約。
109 @note Minusとして使用されている。
110 */
111 Reserved = &h80000000
112End Enum
113
114/*!
115@brief 浮動小数点数をprintfの%e, %E(指数形式、十進法)相当の変換で文字列化する関数。
116@author Egtra
117@date 2007/09/18
118@param[in] x 文字列化する浮動小数点数値。
119@param[in] precision 精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
120@param[in] field フィールド幅。
121@param[in] flags 書式フラグ。
122@return xの文字列表現
123
124@todo 他の実装での末尾桁の扱いを調べる(このコードでは何もしていないので切捨となっている)。
125*/
126Function FormatFloatE(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
127 If precision = DWORD_MAX Then
128 precision = 6
129 End If
130
131 Dim e As Long, negative As Boolean
132 Dim s = FloatToChars(x, e, negative)
133 Dim sb = FormatFloatE_Base(s, negative, precision, flags)
134 FormatFloatE_Exponent(sb, e, flags)
135 AdjustFieldWidth(sb, field, flags)
136 FormatFloatE = sb.ToString()
137End Function
138
139/**
140@brief FormatFloatEの符号・基数部の出力用。
141@author Egtra
142@date 2007/10/27
143*/
144Function FormatFloatE_Base(s As String, negative As Boolean, precision As DWord, ByRef flags As FormatFlags) As System.Text.StringBuilder
145 FormatFloatE_Base = New System.Text.StringBuilder
146 With FormatFloatE_Base
147 AppendSign(FormatFloatE_Base, negative, flags)
148
149 .Append(s[0])
150
151 If (flags And Alt) Or precision > 0 Then
152 .Append(".")
153 Dim outputLen = s.Length - 1
154 If outputLen >= precision Then
155 .Append(s, 1, precision)
156 Else 'sで用意された桁が指定された精度より少ないとき
157 .Append(s, 1, outputLen)
158 .Append(&h30 As StrChar, precision - outputLen) '足りない桁は0埋め
159 End If
160 End If
161 End With
162End Function
163
164/**
165@brief FormatFloatEの指数部の出力用。
166@author Egtra
167@date 2007/10/27
168*/
169Sub FormatFloatE_Exponent(buf As System.Text.StringBuilder, e As Long, flags As FormatFlags)
170 With buf
171 If flags And Cap Then
172 .Append("E")
173 Else
174 .Append("e")
175 End If
176 .Append(FormatIntegerD(e, 2, 0, Sign Or Zero))
177 End With
178End Sub
179
180/*!
181@brief 浮動小数点数をprintfの%f(小数形式、十進法)相当の変換で文字列化する関数。
182@author Egtra
183@date 2007/10/23
184@param[in] x 文字列化する浮動小数点数値。
185@param[in] precision 精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
186@param[in] field フィールド幅。
187@param[in] flags 書式フラグ。
188@return xの文字列表現
189*/
190Function FormatFloatF(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
191 If precision = DWORD_MAX Then
192 precision = 6
193 End If
194
195 Dim e As Long, negative As Boolean
196 Dim s = FloatToChars(x, e, negative)
197 Dim sb = FormatFloatF_Core(s, e, negative, precision, flags)
198 AdjustFieldWidth(sb, field, flags)
199 FormatFloatF = sb.ToString()
200End Function
201
202/**
203@author Egtra
204@date 2007/10/27
205*/
206Function FormatFloatF_Core(s As String, e As Long, negative As Boolean, precision As DWord, ByRef flags As FormatFlags) As System.Text.StringBuilder
207 FormatFloatF_Core = New System.Text.StringBuilder(128)
208 With FormatFloatF_Core
209 AppendSign(FormatFloatF_Core, negative, flags)
210
211 Dim intPartLen = e + 1
212 Dim outputDigit = 0 As DWord
213 If intPartLen >= 17 Then
214 '有効桁が全て整数部に収まる場合
215 .Append(s)
216 .Append(&h30 As StrChar, intPartLen - 17)
217 outputDigit = 17
218 ElseIf intPartLen > 0 Then
219 '有効桁の一部が整数部にかかる場合
220 .Append(s, 0, intPartLen)
221 outputDigit = intPartLen
222 Else
223 '有効桁が全く整数部にかからない場合
224 .Append(&h30 As StrChar)
225 End If
226
227 If precision > 0 Or (flags And Alt) Then
228 .Append(".")
229
230 Dim lastDigit = s.Length - outputDigit
231 If lastDigit >= precision Then '変換して得られた文字列の桁数が精度以上ある場合
232 Dim zeroDigit = 0
233 If intPartLen < 0 Then
234 '1.23e-4 = 0.000123のように指数が負のため小数点以下に0が続く場合
235 zeroDigit = System.Math.Min(-intPartLen As DWord, precision)
236 .Append(&h30 As StrChar, zeroDigit As Long)
237 End If
238 .Append(s, outputDigit, (precision - zeroDigit) As Long)
239 Else
240 .Append(s, outputDigit, lastDigit)
241 .Append(&h30 As StrChar, (precision - lastDigit) As Long) '残りの桁は0埋め
242 End If
243 End If
244 End With
245End Function
246
247/*!
248@brief 浮動小数点数をprintfの%g, %G(小数・指数、十進法)相当の変換で文字列化する関数。
249@author Egtra
250@date 2007/10/23
251@param[in] x 文字列化する浮動小数点数値。
252@param[in] precision 精度。小数点以下の桁数。DWORD_MAXまたは0のとき、指定なしとして既定値6となる。
253@param[in] field フィールド幅。
254@param[in] flags 書式フラグ。
255@return xの文字列表現
256@todo 下位桁の扱いの調査。
257*/
258Function FormatFloatG(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
259 'GではE/Fと違い整数部も有効桁数に数えるのでその分を引いておく。
260 If precision = DWORD_MAX Or precision = 0 Then
261 precision = 5
262 Else
263 precision--
264 End If
265
266 Dim e As Long, negative As Boolean
267 Dim s = FloatToChars(x, e, negative)
268
269 Dim sb = Nothing As System.Text.StringBuilder
270
271 If -5 < e And e < precision Then
272 sb = FormatFloatF_Core(s, e, negative, -e + precision, flags)
273 FormatFloatG_RemoveLowDigit(sb, flags)
274 Else
275 sb = FormatFloatE_Base(s, negative, precision, flags)
276 FormatFloatG_RemoveLowDigit(sb, flags)
277 FormatFloatE_Exponent(sb, e, flags)
278 End If
279
280 AdjustFieldWidth(sb, field, flags)
281 FormatFloatG = sb.ToString()
282End Function
283
284/*!
285@brief FormatFloatG/A用の小数点以下末尾の0を削除するルーチン
286@author Egtra
287@date 2007/10/27
288@param[in, out] sb 文字列バッファ
289@param[in] flags フラグ
290flagsでAltが立っているとき、この関数は何もしない。
291*/
292Sub FormatFloatG_RemoveLowDigit(sb As System.Text.StringBuilder, flags As FormatFlags)
293 Imports ActiveBasic.Strings
294
295 Dim count = sb.Length
296 If (flags And Alt) = 0 Then
297 Dim point = ChrFind(StrPtr(sb), count As SIZE_T, Asc("."))
298 If point = -1 Then
299 Debug
300 End If
301
302 Dim i As Long
303 For i = count - 1 To point + 1 Step -1
304 If sb[i] <> &h30 Then
305 Exit For
306 End If
307 Next
308 If i <> point Then
309 i++
310 End If
311 sb.Length = i
312 End If
313End Sub
314
315/*!
316@brief 浮動小数点数をprintfの%a, %A(指数形式、十六進法)相当の変換で文字列化する関数。
317@author Egtra
318@date 2007/09/18
319@param[in] x 文字列化する浮動小数点数値。
320@param[in] precision 精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値13となる。
321@param[in] field フィールド幅。
322@param[in] flags 書式フラグ。
323@return xの文字列表現
324
325C99では、末尾の0を取り除いても良いとあるので、
326このルーチンでは取り除くことにしている。
327*/
328Function FormatFloatA(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
329 If precision = DWORD_MAX Then
330 precision = 13
331 End If
332
333 Dim pqw = VarPtr(x) As *QWord
334
335 Dim sb = New System.Text.StringBuilder
336 With sb
337 Dim sign = (GetQWord(pqw) And &H8000000000000000) As Boolean
338 pqw[0] And= &h7fffffffffffffff
339
340 AppendSign(sb, sign, flags)
341
342 If flags And BPrefix Then
343 .Append("&H")
344 Else
345 .Append("0X")
346 End If
347
348 Dim biasedExp = (GetQWord(pqw) >> 52) As DWord And &h7FF
349 Dim exp As Long
350 If biasedExp = 0 Then
351 If GetQWord(pqw) <> 0 Then
352 exp = -1022 '非正規化数への対応
353 Else
354 exp = 0
355 End If
356 .Append("0")
357 Else
358 exp = biasedExp - 1023
359 .Append("1")
360 End If
361
362 If precision > 0 Or (flags And Alt) Then
363 .Append(".")
364 Dim base = FormatIntegerLX(GetQWord(pqw) And &h000fffffffffffff, 13, 0, flags And Cap)
365 Dim diff = precision - 13 As Long
366 If diff <= 0 Then
367 .Append(Left$(base, precision))
368 Else
369 .Append(base).Append(&h30, diff)
370 End If
371 End If
372
373 FormatFloatG_RemoveLowDigit(sb, flags)
374
375 .Append("P")
376 .Append(FormatIntegerD(exp, 1, 0, Sign))
377
378 FormatFloatA = .ToString()
379 End With
380
381 If (flags And Cap) = 0 Then
382 FormatFloatA = FormatFloatA.ToLower()
383 End If
384End Function
385
386/*!
387@brief 先頭に符号もしくはその分の空白を出力する。FormatFloat用。
388@author Egtra
389@date 2007/10/23
390@param[in, out] sb 出力先
391@param[in] negative 符号
392@param[in, out] flags フラグ。negative = Trueなら、Signを立てて返す。
393*/
394Sub AppendSign(sb As System.Text.StringBuilder, negative As Boolean, ByRef flags As FormatFlags)
395 With sb
396 If negative Then
397 .Append("-")
398 flags Or= Sign
399 Else
400 If flags And Sign Then
401 .Append("+")
402 ElseIf flags And Blank Then
403 .Append(" ")
404 End If
405 End If
406 End With
407End Sub
408
409/*!
410@brief DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
411@author Egtra
412@date 2007/09/18
413*/
414Const MaxSizeU = 9
415
416/*!
417@brief 符号無し整数をprintfの%u(十進法表現)相当の変換で文字列化する関数。
418@author Egtra
419@date 2007/09/18
420@param[in] x 文字列化する整数値。
421@param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
422@param[in] field フィールド幅。
423@param[in] flags 書式フラグ。
424@return xの文字列表現
425*/
426Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
427 Return FormatIntegerEx(TraitsIntegerU[0], x, d, field, flags And (Not (Sign Or Blank)))
428End Function
429
430/*!
431@brief FormatIntegerUのQWord版
432@author Egtra
433@date 2007/10/26
434*/
435Function FormatIntegerLU(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
436 Return FormatIntegerEx(TraitsIntegerU[1], x, d, field, flags And (Not (Sign Or Blank)))
437End Function
438
439/*!
440@brief 符号有り整数をprintfの%d(十進法表現)相当の変換で文字列化する関数。
441@author Egtra
442@date 2007/10/13
443@param[in] x 文字列化する整数値。
444@param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
445@param[in] field フィールド幅。
446@param[in] flags 書式フラグ。
447@return xの文字列表現
448*/
449Function FormatIntegerD(x As Long, d As DWord, field As DWord, flags As FormatFlags) As String
450 Return FormatIntegerEx(TraitsIntegerD[0], (x As Int64) As QWord, d, field, flags)
451End Function
452
453/*!
454@brief FormatIntegerDのInt64版
455@author Egtra
456@date 2007/10/26
457*/
458Function FormatIntegerLD(x As Int64, d As DWord, field As DWord, flags As FormatFlags) As String
459 Return FormatIntegerEx(TraitsIntegerD[1], x As QWord, d, field, flags)
460End Function
461
462/*!
463@author Egtra
464@date 2007/10/26
465*/
466Dim TraitsIntegerU[1] As IntegerConvertTraits
467With TraitsIntegerU[0]
468 .Convert = AddressOf(IntegerU_Convert)
469 .Prefix = AddressOf(IntegerU_Prefix)
470 .MaxSize = MaxSizeU
471End With
472
473With TraitsIntegerU[1]
474 .Convert = AddressOf(IntegerLU_Convert)
475 .Prefix = AddressOf(IntegerU_Prefix)
476 .MaxSize = MaxSizeLU
477End With
478
479/*!
480@author Egtra
481@date 2007/10/28
482*/
483Dim TraitsIntegerD[1] As IntegerConvertTraits
484With TraitsIntegerD[0]
485 .Convert = AddressOf(IntegerD_Convert)
486 .Prefix = AddressOf(IntegerD_Prefix)
487 .MaxSize = MaxSizeU
488End With
489
490With TraitsIntegerD[1]
491 .Convert = AddressOf(IntegerLD_Convert)
492 .Prefix = AddressOf(IntegerD_Prefix)
493 .MaxSize = MaxSizeLU
494End With
495
496/*!
497@brief 負数を表すフラグ。FormatIntegerD, LDからIntegerDU_Prefixまでの内部処理用。
498@author Egtra
499@date 2007/10/26
500*/
501Const Minus = Reserved
502
503/*!
504@author Egtra
505@date 2007/10/26
506*/
507Function IntegerU_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
508 Dim x = xq As DWord
509 Dim i = MaxSizeU
510 While x <> 0
511 buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
512 x \= 10
513 i--
514 Wend
515 Return i
516End Function
517
518/*!
519@brief IntegerU_ConvertのQWord版
520@author Egtra
521@date 2007/10/26
522@bug #117のため、現在Int64の最大値を超える値を正しく処理できない。
523*/
524Function IntegerLU_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
525 Dim i = MaxSizeLU
526 While x <> 0
527 buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
528 x \= 10
529 i--
530 Wend
531 Return i
532End Function
533
534/*!
535@author Egtra
536@date 2007/10/26
537*/
538Function IntegerU_Prefix(x As QWord, flags As FormatFlags) As String
539End Function
540
541/*!
542@author Egtra
543@date 2007/10/28
544*/
545Function IntegerD_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
546 Return IntegerU_Convert(buf, Abs((xq As DWord) As Long) As DWord, flags)
547End Function
548
549/*!
550@brief IntegerD_ConvertのInt64版
551@author Egtra
552@date 2007/10/28
553*/
554Function IntegerLD_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
555 Return IntegerLU_Convert(buf, Abs(x As Int64) As QWord, flags)
556End Function
557
558/*!
559@author Egtra
560@date 2007/10/28
561*/
562Function IntegerD_Prefix(x As QWord, flags As FormatFlags) As String
563 If (x As Int64) < 0 Then
564 IntegerD_Prefix = "-"
565 ElseIf flags And Sign Then
566 IntegerD_Prefix = "+"
567 ElseIf flags And Blank Then
568 IntegerD_Prefix = " "
569 End If
570End Function
571
572/*!
573@brief DWordの最大値の八進法表現37777777777の文字数 - 1 + 1。IntegerO_Convert内で使用。
574@author Egtra
575@date 2007/10/19
576上の式で1を加えているのは、八進接頭辞の分。
577*/
578Const MaxSizeO = 11
579
580/*!
581@brief QWordの最大値の八進法表現1777777777777777777777の文字数 - 1 + 1。IntegerO_Convert内で使用。
582@author Egtra
583@date 2007/10/26
584上の式で1を加えているのは、八進接頭辞の分。
585*/
586Const MaxSizeLO = 22
587
588/*!
589@author Egtra
590@date 2007/10/22
591*/
592Dim TraitsIntegerO[1] As IntegerConvertTraits
593With TraitsIntegerO[0]
594 .Convert = AddressOf(IntegerO_Convert)
595 .Prefix = AddressOf(IntegerO_Prefix)
596 .MaxSize = MaxSizeO
597End With
598
599With TraitsIntegerO[1]
600 .Convert = AddressOf(IntegerLO_Convert)
601 .Prefix = AddressOf(IntegerO_Prefix)
602 .MaxSize = MaxSizeLO
603End With
604
605/*!
606@brief 符号無し整数をprintfの%o(八進法表現)相当の変換で文字列化する関数。
607@author Egtra
608@date 2007/10/19
609@param[in] x 文字列化する整数値。
610@param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
611@param[in] field フィールド幅。
612@param[in] flags 書式フラグ。
613@return xの文字列表現
614*/
615Function FormatIntegerO(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
616 Return FormatIntegerEx(TraitsIntegerO[0], x, d, field, flags)
617End Function
618
619/*!
620@brief FormatIntegerOのQWord版。
621@author Egtra
622@date 2007/10/26
623*/
624Function FormatIntegerLO(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
625 Return FormatIntegerEx(TraitsIntegerO[1], x, d, field, flags)
626End Function
627
628/*!
629@author Egtra
630@date 2007/10/22
631*/
632Function IntegerO_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
633 Dim x = xq As DWord
634 Dim i = MaxSizeO
635 While x <> 0
636 buf[i] = ((x And &o7) + &h30) As StrChar
637 x >>= 3
638 i--
639 Wend
640 If flags And Alt Then
641 buf[i] = &h30
642 i--
643 End If
644 Return i
645End Function
646
647/*!
648@brief IntegerO_ConvertのQWord版。
649@author Egtra
650@date 2007/10/26
651*/
652Function IntegerLO_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
653 Dim i = MaxSizeLO
654 While x <> 0
655 buf[i] = ((x And &o7) + &h30) As StrChar
656 x >>= 3
657 i--
658 Wend
659 If flags And Alt Then
660 buf[i] = &h30
661 i--
662 End If
663 Return i
664End Function
665
666/*!
667@author Egtra
668@date 2007/10/22
669@note #フラグ (Alt)の処理は、IntegerO/LO_Convert内で行うので、ここで処理することはない。
670*/
671Function IntegerO_Prefix(x As QWord, flags As FormatFlags) As String
672 If flags And BPrefix Then
673 If x <> 0 Then
674 IntegerO_Prefix = "&O"
675 End If
676 End If
677End Function
678
679/*!
680@brief DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
681@author Egtra
682@date 2007/10/24
683*/
684Const MaxSizeX = 7
685
686/*!
687@brief QWordの最大値の十六進法表現ffffffffffffffffの文字数 - 1。FormatIntegerO内で使用。
688@author Egtra
689@date 2007/10/26
690*/
691Const MaxSizeLX = 15
692
693/*!
694@author Egtra
695@date 2007/10/24
696*/
697Dim TraitsIntegerX[1] As IntegerConvertTraits
698With TraitsIntegerX[0]
699 .Convert = AddressOf(IntegerX_Convert)
700 .Prefix = AddressOf(IntegerX_Prefix)
701 .MaxSize = MaxSizeX
702End With
703
704With TraitsIntegerX[1]
705 .Convert = AddressOf(IntegerLX_Convert)
706 .Prefix = AddressOf(IntegerX_Prefix)
707 .MaxSize = MaxSizeLX
708End With
709
710/*!
711@brief 整数をprintfの%x, %X(十六進法)相当の変換で文字列化する関数。
712@author Egtra
713@date 2007/10/19
714@param[in] x 文字列化する整数値。
715@param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
716@param[in] field フィールド幅。
717@param[in] flags 書式フラグ。
718@return xの文字列表現
719*/
720Function FormatIntegerX(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
721 Return FormatIntegerEx(TraitsIntegerX[0], x, d, field, flags)
722End Function
723
724/*!
725@brief FormatIntegerXのQWord版。
726@author Egtra
727@date 2007/10/22
728*/
729Function FormatIntegerLX(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
730 Return FormatIntegerEx(TraitsIntegerX[1], x, d, field, flags)
731End Function
732
733/*
734@brief 0からFまでの文字を収めた表
735@author egtra
736*/
737Dim HexadecimalTable[&h10] = [&h30, &h31, &h32, &h33, &h34, &h35, &h36, &h37, &h38, &h39, &h41, &h42, &h43, &h44, &h45, &h46] As Byte
738
739/*!
740@author Egtra
741@date 2007/10/22
742*/
743Function IntegerX_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
744 Dim i = MaxSizeX
745 Dim x = xq As DWord
746 While x <> 0
747 buf[i] = HexadecimalTable[x And &h0f]
748 x >>= 4
749 i--
750 Wend
751 Return i
752End Function
753
754/*!
755@brief IntegerX_ConvertのQWord版。
756@author Egtra
757@date 2007/10/22
758*/
759Function IntegerLX_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
760 Dim i = MaxSizeLX
761 While x <> 0
762 buf[i] = HexadecimalTable[x And &h0f]
763 x >>= 4
764 i--
765 Wend
766 Return i
767End Function
768
769/*!
770@author Egtra
771@date 2007/10/24
772*/
773Function IntegerX_Prefix(x As QWord, flags As FormatFlags) As String
774 If x <> 0 Then
775 If flags And Alt Then
776 IntegerX_Prefix = "0X"
777 ElseIf flags And BPrefix Then
778 IntegerX_Prefix = "&H"
779 End If
780 End If
781End Function
782
783/*!
784@brief FormatIntegerExへ渡す変換特性を表す構造体型。
785@author Egtra
786@date 2007/10/22
787
788FormatIntegerの都合上、このファイル内で宣言しているIntegerConvertTraits型の
789変数は全て配列となっている;[0]が32ビット変換、[1]が64ビット変換である。
790*/
791Type IntegerConvertTraits
792 '!変換を行う関数へのポインタ。
793 Convert As *Function(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
794 '!接頭辞を取得する関数へのポインタ。
795 Prefix As *Function(x As QWord, flags As FormatFlags) As String
796 '!必要なバッファの大きさ。
797 MaxSize As DWord
798End Type
799
800/*!
801@brief 整数変換全てを行う関数。これを雛形とし、形式毎の差異はIntegerConvertTraitsで表現する。
802@author Egtra
803@date 2007/10/22
804@param[in] tr 特性情報。
805@param[in] x 変換元の数値。
806@param[in] d 精度。ここでは最低限出力する桁数。
807@param[in] field フィールド幅。
808@param[in] flags フラグ。
809*/
810Function FormatIntegerEx(ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
811 If d = DWORD_MAX Then
812 d = 1
813 Else
814 '精度が指定されているとき、ゼロフラグは無視される。
815 '仕様上、左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。
816 flags And= Not Zero
817 End If
818
819 Dim sb = New System.Text.StringBuilder
820 With sb
821 Dim prefixFunc = tr.Prefix
822 Dim prefix = prefixFunc(x, flags)
823 sb.Append(prefix)
824
825 Dim prefixLen = 0 As DWord
826 If String.IsNullOrEmpty(prefix) = False Then
827 prefixLen = prefix.Length As DWord
828 End If
829
830' Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar
831 Dim buf[MaxSizeLO] As StrChar
832 Dim convertFunc = tr.Convert
833 Dim bufStartPos = convertFunc(buf, x, flags)
834
835 Dim len = (tr.MaxSize - bufStartPos) As Long
836 If len < 0 Then
837 Debug
838 End If
839 If len < d Then
840 .Append(&h30 As StrChar, d - len)
841 End If
842
843 .Append(buf, bufStartPos + 1, len)
844
845 AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen)
846 End With
847 FormatIntegerEx = sb.ToString()
848
849 If (flags And Cap) = 0 Then
850 FormatIntegerEx = FormatIntegerEx.ToLower()
851 End If
852End Function
853Sub FormatIntegerEx(sb As System.Text.StringBuilder, ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags)
854
855 If d = DWORD_MAX Then
856 d = 1
857 Else
858 '精度が指定されているとき、ゼロフラグは無視される。
859 '仕様上、左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。
860 flags And= Not Zero
861 End If
862
863 Dim lastLength = sb.Length
864
865 With sb
866 Dim prefixFunc = tr.Prefix
867 Dim prefix = prefixFunc(x, flags)
868 sb.Append(prefix)
869
870 Dim prefixLen = 0 As DWord
871 If String.IsNullOrEmpty(prefix) = False Then
872 prefixLen = prefix.Length As DWord
873 End If
874
875' Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar
876 Dim buf[MaxSizeLO] As StrChar
877 Dim convertFunc = tr.Convert
878 Dim bufStartPos = convertFunc(buf, x, flags)
879
880 Dim len = (tr.MaxSize - bufStartPos) As Long
881 If len < 0 Then
882 Debug
883 End If
884 If len < d Then
885 .Append(&h30 As StrChar, d - len)
886 End If
887
888 .Append(buf, bufStartPos + 1, len)
889
890 AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen, lastLength)
891 End With
892 Dim t = sb.ToString()
893
894 If (flags And Cap) = 0 Then
895 Dim len = sb.Length
896 Dim i As Long
897 For i = lastLength To ELM(len)
898 sb[i] = CType.ToLower(sb[i])
899 Next
900 End If
901End Sub
902
903/*!
904@brief QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
905@author Egtra
906@date 2007/09/18
907*/
908Const MaxSizeLU = 19
909
910/*!
911@brief 書式化の仕上げとして、変換部分がフィールド幅まで満たされるように空白などを挿入する。
912@author Egtra
913@date 2007/10/13
914@param[in,out] sb 対象文字列
915@param[in] field フィールド幅
916@param[in] hasSign 符号を持っている(負の値か)か否か
917@param[in] flags フラグ
918@param[in] prefixLen (あれば)接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。
919@param[in] offset 変換した部分へのオフセット。AppendではなくInsertを行う際に用いられる。
920sbが"-1"のように負符号を持っている場合は、呼出元でSignフラグ(またはBlank)を立てること。
921*/
922Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, flags As FormatFlags, prefixLen = 0 As DWord, offset = 0 As Long)
923 With sb
924 Dim len = .Length - offset
925 If len < field Then
926 Dim embeddedSize = field - len
927 If flags And LeftSide Then
928 .Append(&h20, embeddedSize)
929 Else
930 If (flags And Zero) <> 0 Then
931 offset += prefixLen
932 If (flags And Blank) Or (flags And Sign) Then
933 offset++
934 End If
935 .Insert(offset, String$(embeddedSize, "0"))
936 Else
937 .Insert(offset, String$(embeddedSize, " "))
938 End If
939 End If
940 End If
941 End With
942End Sub
943
944/*!
945@brief 文字列をprintfの%s相当の変換で書式化する関数。
946@author Egtra
947@date 2007/10/27
948@param[in] x 文字列。
949@param[in] d 精度、最大の文字数。
950@param[in] field フィールド幅。
951@param[in] flags 書式フラグ。
952@return 書式化された文字列。
953*/
954Function FormatString(x As String, d As DWord, field As DWord, flags As FormatFlags) As String
955 Dim sb = New System.Text.StringBuilder(
956 x, 0, System.Math.Min(x.Length As DWord, d) As Long, field)
957 AdjustFieldWidth(sb, field, flags And LeftSide)
958 FormatString = sb.ToString()
959End Function
960
961/*!
962@brief 文字をprintfの%c相当の変換で書式化する関数。
963@author Egtra
964@date 2007/10/27
965@param[in] x 文字。
966@param[in] d 精度、最大の文字数。
967@param[in] field フィールド幅。
968@param[in] flags 書式フラグ。
969@return 書式化された文字列。
970*/
971Function FormatCharacter(x As StrChar, d As DWord, field As DWord, flags As FormatFlags) As String
972 Dim sb = New System.Text.StringBuilder(field + 1)
973 sb.Append(x)
974 AdjustFieldWidth(sb, field, flags And LeftSide)
975 FormatCharacter = sb.ToString()
976End Function
977
978/*!
979@author Egtra
980@date 2007/10/28
981*/
982TypeDef FormatFloatProc = *Function(x As Double, precision As DWord, fieldWidth As DWord, flags As FormatFlags) As String
983
984/*!
985@brief SPrintfから呼ばれる浮動小数点数用書式文字列化関数
986@author Egtra
987@date 2007/10/28
988*/
989Sub FormatFloat(s As System.Text.StringBuilder, formatProc As FormatFloatProc,
990 param As Object, precision As DWord, field As DWord, flags As FormatFlags)
991
992 Dim x As Double
993 Dim typeName = param.GetType().FullName
994 If typeName = "System.Double" Then
995 x = param As System.Double
996 ElseIf typeName = "System.Single" Then
997 x = param As System.Single
998 End If
999 s.Append(formatProc(x, precision, field, flags))
1000End Sub
1001
1002/*!
1003@brief SPrintfから呼ばれる整数用書式文字列化関数
1004@author Egtra
1005@date 2007/10/28
1006*/
1007Sub FormatInteger(s As System.Text.StringBuilder, traits As *IntegerConvertTraits,
1008 param As Object, signed As Boolean, typeWidth As Long, precision As DWord, field As DWord, flags As FormatFlags)
1009
1010 Dim x As QWord
1011 Dim typeName = param.GetType().FullName
1012 If typeName = "System.UInt64" Then
1013 x = param As System.UInt64
1014 ElseIf typeName = "System.Int64" Then
1015 x = (param As System.Int64) As QWord
1016 ElseIf typeName = "System.UInt32" Then
1017 x = param As System.UInt32
1018 ElseIf typeName = "System.Int32" Then
1019 x = (param As System.Int32) As QWord
1020 ElseIf typeName = "System.UInt16" Then
1021 x = param As System.UInt16
1022 ElseIf typeName = "System.Int16" Then
1023 x = (param As System.Int16) As QWord
1024 ElseIf typeName = "System.UInt8" Then
1025 x = param As System.Byte
1026 ElseIf typeName = "System.Int8" Then
1027 x = (param As System.SByte) As QWord
1028 End If
1029 '一旦縮めた後、符号・ゼロ拡張させる。
1030 'また、64ビット整数なら64ビット変換Traitsを選択する。
1031 If signed Then
1032 If typeWidth = 1 Then
1033 traits = VarPtr(traits[1])
1034 ElseIf typeWidth = 0 Then
1035 x = (((x As DWord) As Long) As Int64) As QWord
1036 ElseIf typeWidth = -1 Then
1037 x = (((x As Word) As Integer) As Int64) As QWord
1038 ElseIf typeWidth = -2 Then
1039 x = (((x As Byte) As SByte) As Int64) As QWord
1040 End If
1041 Else
1042 If typeWidth = 1 Then
1043 traits = VarPtr(traits[1])
1044 ElseIf typeWidth = 0 Then
1045 x = x As DWord
1046 ElseIf typeWidth = -1 Then
1047 x = x As Word
1048 ElseIf typeWidth = -2 Then
1049 x = x As Byte
1050 End If
1051 End If
1052
1053' s.Append(FormatIntegerEx(ByVal traits, x, precision, field, flags))
1054 FormatIntegerEx(s, ByVal traits, x, precision, field, flags)
1055End Sub
1056
1057'Format関数群ここまで
1058'----
1059
1060/*!
1061@brief 文字列から数値への変換。さらに変換に使われなかった文字列の位置を返す。
1062@author Egtra
1063@date 2007/11/11
1064@param[in] s 変換する文字
1065@param[out] p 変換に使われなかった部分の先頭を指すポインタ
1066@return 変換して得られた数値。変換できなければ0。
1067*/
1068Function StrToLong(s As *StrChar, ByRef p As *StrChar) As Long
1069 Dim negative As Boolean
1070 Dim i = 0 As Long
1071 If s[i] = &h2d Then 'Asc("-")
1072 i++
1073 negative = True
1074 End If
1075 Do
1076 Dim c = s[i]
1077 If Not CType.IsDigit(c) Then Exit Do
1078 StrToLong *= 10
1079 StrToLong += ((c As DWord) And &h0f) As Long
1080 i++
1081 Loop
1082 If negative Then
1083 StrToLong = -StrToLong
1084 End If
1085 p = VarPtr(s[i])
1086End Function
1087
1088/*!
1089@brief フィールド幅、精度用の数値読取
1090@author Egtra
1091@date 2007/11/11
1092@param[in, out] fmt 読み途中の書式指定
1093@param[in] params
1094@param[in, out] paramsCount
1095@param[out] ret 読み取った数値。読み取られなかったときの値は不定。
1096@retval True 読取を行った
1097@retval False 行わなかった
1098fmt[0]が*のときにはparamsから1つ読み取る。
1099そうでなく、fmtに数字(先頭に-符号があっても可)が並んでいれば、それを読み取る。
1100*/
1101Function ReadInt(ByRef fmt As *StrChar, params As *Object, ByRef paramsCount As SIZE_T, ByRef ret As Long) As Boolean
1102 If fmt[0] = &h2a Then '*
1103 fmt = VarPtr(fmt[1]) 'po
1104 ret = params[paramsCount] As System.Int32
1105 paramsCount++
1106 ReadInt = True
1107 Else
1108 Dim p As *StrChar
1109 ret = StrToLong(fmt, p)
1110 If fmt <> p Then
1111 fmt = p
1112 ReadInt = True
1113 Else
1114 ReadInt = False
1115 End If
1116 End If
1117End Function
1118
1119/*!
1120@brief フラグ指定の読み込み
1121@author Egtra
1122@date 2007/10/28
1123@param[in, out] fmt
1124@param[out] flags
1125@retval True 読み込みが完了した。
1126@retval False 読み取り中に文字列が終了した(ヌル文字が現れた)。
1127*/
1128Function ReadFlags(ByRef fmt As *StrChar, ByRef flags As FormatFlags) As Boolean
1129 ReadFlags = False
1130 Do
1131 Select Case fmt[0]
1132 Case &h23 '#
1133 flags Or= Alt
1134 Case &h30 '0
1135 flags Or= Zero
1136 Case &h20 '空白
1137 flags Or= Blank
1138 Case &h2b '+
1139 flags Or= Sign
1140 Case &h2d '-
1141 flags Or = LeftSide
1142 Case &h26 '&
1143 flags Or= BPrefix
1144 Case 0
1145 Exit Function
1146 Case Else
1147 Exit Do
1148 End Select
1149 fmt = VarPtr(fmt[1]) 'po
1150 Loop
1151 ReadFlags = True
1152End Function
1153
1154/*!
1155@brief フィールド幅指定の読み込み
1156@author Egtra
1157@date 2007/10/29
1158@param[in, out] fmt
1159@param[in] params
1160@param[in, out] paramsCount
1161@param[out] fieldWidth
1162@param[in, out] flags
1163*/
1164Sub ReadFieldWidth(ByRef fmt As *StrChar, params As *Object, ByRef paramsCount As SIZE_T,
1165 ByRef fieldWidth As DWord, ByRef flags As FormatFlags)
1166 Dim t As Long
1167 If ReadInt(fmt, params, paramsCount, t) Then
1168 If t < 0 Then
1169 flags Or= LeftSide
1170 fieldWidth = -t As DWord
1171 Else
1172 fieldWidth = t As DWord
1173 End If
1174 Else
1175 fieldWidth = 0
1176 End If
1177End Sub
1178
1179/*!
1180@brief 精度の読み込み
1181@author Egtra
1182@date 2007/10/29
1183@param[in, out] fmt
1184@param[in] params
1185@param[in, out] paramsCount
1186@return 読み取った精度。指定がなかったときには、DWORD_MAX。
1187*/
1188Function ReadPrecision(ByRef fmt As *StrChar,
1189 params As *Object, ByRef paramsCount As SIZE_T) As DWord
1190
1191 If fmt[0] = &h2e Then '.
1192 fmt = VarPtr(fmt[1]) 'po
1193 Dim t As Long
1194 ReadPrecision = 0
1195 If ReadInt(fmt, params, paramsCount, t) Then
1196 If t > 0 Then
1197 ReadPrecision = t As DWord
1198 End If
1199 End If
1200 Else
1201 ReadPrecision = DWORD_MAX
1202 End If
1203End Function
1204
1205#ifdef _WIN64
1206Const PtrLength = 1
1207#else
1208Const PtrLength = 0
1209#endif
1210
1211/*!
1212@biref 長さ指定の読み込み
1213@author Egtra
1214@date 2007/10/29
1215@param[in, out] fmt
1216@param[out] lengthSpec
1217*/
1218Sub ReadLength(ByRef fmt As *StrChar, ByRef lengthSpec As Long)
1219 Do
1220 Select Case fmt[0]
1221 Case &h6c 'l
1222 lengthSpec++
1223 Case &h68 'h
1224 lengthSpec--
1225 Case &h6a 'j (u)intmax_t = QWord, Int64
1226 lengthSpec = 1
1227 Case &h74 't ptrdiff_t
1228 lengthSpec = PtrLength
1229 Case &h7a 'z (s)size_t
1230 lengthSpec = PtrLength
1231 Case &h70 'p VoidPtr 本来は変換指定子だが、ここで先読み
1232 lengthSpec = PtrLength
1233 Exit Sub 'fmtを進められると困るので、ここで脱出
1234 Case Else
1235 Exit Sub
1236 End Select
1237 fmt = VarPtr(fmt[1]) 'po
1238 Loop
1239End Sub
1240
1241/*!
1242@biref Cのsprintfのような書式文字列出力関数
1243@author Egtra
1244@date 2007/10/27
1245@param[in] format 書式文字列。詳細は開発Wiki参照。
1246@param[in, out] params 変換対象の配列。n = 0のときにはNULLも可。
1247@param[in] n paramsの個数。
1248@return 書式化された文字列。
1249@todo %nへの対応
1250*/
1251Function SPrintf(format As String, params As *Object, n As SIZE_T) As String
1252 Dim i = 0 As SIZE_T
1253 Dim paramsCount = 0 As SIZE_T
1254 Dim fmt = StrPtr(format)
1255 Dim s = New System.Text.StringBuilder
1256 Do
1257 Dim last = format.Length - (((fmt - StrPtr(format)) \ SizeOf (StrChar)) As LONG_PTR) As Long 'po
1258 Dim pos = ActiveBasic.Strings.ChrFind(fmt, last, &h25 As StrChar) As Long '&h25 = %
1259 If pos = -1 Then
1260 s.Append(fmt, 0, last)
1261 Exit Do
1262 End If
1263 '%以前の部分
1264 s.Append(fmt, 0, pos)
1265 fmt = VarPtr(fmt[pos + 1]) 'po
1266 'フラグの読取
1267 Dim flags = None As FormatFlags
1268 If ReadFlags(fmt, flags) = False Then
1269 Exit Do
1270 End If
1271 'フィールド幅
1272 Dim fieldWidth As DWord
1273 ReadFieldWidth(fmt, params, i, fieldWidth, flags)
1274 '精度
1275 Dim precision = ReadPrecision(fmt, params, i)
1276 '幅指定の読取
1277 Dim typeWidth As Long
1278 ReadLength(fmt, typeWidth)
1279
1280 Select Case fmt[0]
1281 Case &h64 'd
1282 FormatInteger(s, TraitsIntegerD, params[i], True, typeWidth, precision, fieldWidth, flags)
1283 Case &h69 'i
1284 FormatInteger(s, TraitsIntegerD, params[i], True, typeWidth, precision, fieldWidth, flags)
1285 Case &h75 'u
1286 FormatInteger(s, TraitsIntegerU, params[i], False, typeWidth, precision, fieldWidth, flags)
1287 Case &h6f 'o
1288 FormatInteger(s, TraitsIntegerO, params[i], False, typeWidth, precision, fieldWidth, flags)
1289 Case &h4f 'O
1290 FormatInteger(s, TraitsIntegerO, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
1291 Case &h78 'x
1292 FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags)
1293 Case &h58 'X
1294 FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
1295'現状ではVoidPtrを引数にする手段は無いはず
1296' Case &h58 'p
1297' FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
1298 Case &h65 'e
1299 FormatFloat(s, AddressOf(FormatFloatE), params[i], precision, fieldWidth, flags)
1300 Case &h45 'E
1301 FormatFloat(s, AddressOf(FormatFloatE), params[i], precision, fieldWidth, flags Or Cap)
1302 Case &h66 'f
1303 FormatFloat(s, AddressOf(FormatFloatF), params[i], precision, fieldWidth, flags)
1304 Case &h46 'F
1305 FormatFloat(s, AddressOf(FormatFloatF), params[i], precision, fieldWidth, flags Or Cap)
1306 Case &h67 'g
1307 FormatFloat(s, AddressOf(FormatFloatG), params[i], precision, fieldWidth, flags)
1308 Case &h47 'G
1309 FormatFloat(s, AddressOf(FormatFloatG), params[i], precision, fieldWidth, flags Or Cap)
1310 Case &h61 'a
1311 FormatFloat(s, AddressOf(FormatFloatA), params[i], precision, fieldWidth, flags)
1312 Case &h41 'A
1313 FormatFloat(s, AddressOf(FormatFloatA), params[i], precision, fieldWidth, flags Or Cap)
1314 Case &h73 's
1315 s.Append(FormatString(params[i] As String, precision, fieldWidth, flags))
1316 Case &h63 'c
1317 s.Append(FormatCharacter(params[i] As BoxedStrChar, precision, fieldWidth, flags))
1318' Case &h6e 'n
1319 Case &h25 '%
1320 s.Append(&h25 As StrChar)
1321 i--
1322 Case 0
1323 Exit Do
1324 End Select
1325 fmt = VarPtr(fmt[1]) 'po
1326 i++
1327 Loop
1328 SPrintf = s.ToString
1329End Function
1330
1331End Namespace 'Detail
1332
1333/*!
1334@brief Cのsprintfのような書式化関数10引数版
1335@author Egtra
1336@date 2007/10/27
1337@param[in] format 書式指定
1338@param[in] paramN 引数
1339@return 書式化された文字列
1340*/
1341
1342Function SPrintf(format As String, param0 As Object,
1343 param1 As Object, param2 As Object, param3 As Object,
1344 param4 As Object, param5 As Object, param6 As Object,
1345 param7 As Object, param8 As Object, param9 As Object) As String
1346
1347 Dim params = VarPtr(param0) As *Object
1348
1349 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 10)
1350End Function
1351
1352/*!
1353@brief Cのsprintfのような書式化関数9引数版
1354@author Egtra
1355@date 2007/10/27
1356@param[in] format 書式指定
1357@param[in] paramN 引数
1358@return 書式化された文字列
1359*/
1360Function SPrintf(format As String, param0 As Object,
1361 param1 As Object, param2 As Object, param3 As Object,
1362 param4 As Object, param5 As Object, param6 As Object,
1363 param7 As Object, param8 As Object) As String
1364
1365 Dim params = VarPtr(param0) As *Object
1366
1367 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 9)
1368End Function
1369
1370/*!
1371@brief Cのsprintfのような書式化関数8引数版
1372@author Egtra
1373@date 2007/10/27
1374@param[in] format 書式指定
1375@param[in] paramN 引数
1376@return 書式化された文字列
1377*/
1378Function SPrintf(format As String, param0 As Object,
1379 param1 As Object, param2 As Object, param3 As Object,
1380 param4 As Object, param5 As Object, param6 As Object,
1381 param7 As Object) As String
1382
1383 Dim params = VarPtr(param0) As *Object
1384
1385 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 8)
1386End Function
1387
1388/*!
1389@brief Cのsprintfのような書式化関数7引数版
1390@author Egtra
1391@date 2007/10/27
1392@param[in] format 書式指定
1393@param[in] paramN 引数
1394@return 書式化された文字列
1395*/
1396Function SPrintf(format As String, param0 As Object,
1397 param1 As Object, param2 As Object, param3 As Object,
1398 param4 As Object, param5 As Object, param6 As Object) As String
1399
1400 Dim params = VarPtr(param0) As *Object
1401
1402 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 7)
1403End Function
1404
1405/*!
1406@brief Cのsprintfのような書式化関数6引数版
1407@author Egtra
1408@date 2007/10/27
1409@param[in] format 書式指定
1410@param[in] paramN 引数
1411@return 書式化された文字列
1412*/
1413Function SPrintf(format As String, param0 As Object,
1414 param1 As Object, param2 As Object, param3 As Object,
1415 param4 As Object, param5 As Object) As String
1416
1417 Dim params = VarPtr(param0) As *Object
1418
1419 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 6)
1420End Function
1421
1422/*!
1423@brief Cのsprintfのような書式化関数5引数版
1424@author Egtra
1425@date 2007/10/27
1426@param[in] format 書式指定
1427@param[in] paramN 引数
1428@return 書式化された文字列
1429*/
1430Function SPrintf(format As String, param0 As Object,
1431 param1 As Object, param2 As Object, param3 As Object,
1432 param4 As Object) As String
1433
1434 Dim params = VarPtr(param0) As *Object
1435
1436 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 5)
1437End Function
1438
1439/*!
1440@brief Cのsprintfのような書式化関数4引数版
1441@author Egtra
1442@date 2007/10/27
1443@param[in] format 書式指定
1444@param[in] paramN 引数
1445@return 書式化された文字列
1446*/
1447Function SPrintf(format As String, param0 As Object,
1448 param1 As Object, param2 As Object, param3 As Object) As String
1449
1450 Dim params = VarPtr(param0) As *Object
1451
1452 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 4)
1453End Function
1454
1455/*!
1456@brief Cのsprintfのような書式化関数3引数版
1457@author Egtra
1458@date 2007/10/27
1459@param[in] format 書式指定
1460@param[in] paramN 引数
1461@return 書式化された文字列
1462*/
1463Function SPrintf(format As String, param0 As Object,
1464 param1 As Object, param2 As Object) As String
1465
1466 Dim params = VarPtr(param0) As *Object
1467
1468 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 3)
1469End Function
1470
1471/*!
1472@brief Cのsprintfのような書式化関数2引数版
1473@author Egtra
1474@date 2007/10/27
1475@param[in] format 書式指定
1476@param[in] paramN 引数
1477@return 書式化された文字列
1478*/
1479Function SPrintf(format As String, param0 As Object,
1480 param1 As Object) As String
1481
1482 Dim params = VarPtr(param0) As *Object
1483
1484 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 2)
1485End Function
1486
1487/*!
1488@brief Cのsprintfのような書式化関数1引数版
1489@author Egtra
1490@date 2007/10/27
1491@param[in] format 書式指定
1492@param[in] paramN 引数
1493@return 書式化された文字列
1494*/
1495Function SPrintf(format As String, param0 As Object) As String
1496 Dim params = VarPtr(param0) As *Object
1497 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, params, 1)
1498End Function
1499
1500/*!
1501@brief Cのsprintfのような書式化関数0引数版
1502@author Egtra
1503@date 2007/10/27
1504@param[in] format 書式指定
1505@param[in] paramN 引数
1506@return 書式化された文字列
1507*/
1508Function SPrintf(format As String) As String
1509 SPrintf = ActiveBasic.Strings.Detail.SPrintf(format, 0, 0)
1510End Function
1511
1512End Namespace 'Strings
1513End Namespace 'ActiveBasic
Note: See TracBrowser for help on using the repository browser.