Changeset 358 for trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
- Timestamp:
- Oct 19, 2007, 11:42:51 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
r355 r358 90 90 /*! 代替表記、#。 91 91 <ul> 92 <li>[OoXx]では、 数値の先頭に0、0xを付ける。</ul>92 <li>[OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul> 93 93 <li>[AaEeFfGg]では、精度0でも小数点を付ける。</ul> 94 94 <li>[Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul> … … 172 172 */ 173 173 Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String 174 FormatIntegerU = FormatInteger(x, d, field, flags, 0) 175 End Function 176 177 '! Longの最大値2147483647, -2147483648の符号部を除く文字数 - 1。FormatIntegerU内で使用。 174 FormatIntegerU = FormatInteger(x, d, field, flags And (Not (Sign Or Blank)), 0) 175 End Function 176 177 /*! 178 DWordの最大値4294967295やLongの最大値2147483647、最小値-2147483648 179 (全て十進法)の符号部を除いた文字数 - 1。FormatIntegerU内で使用。 180 */ 178 181 Const MaxSizeD = 9 179 182 … … 219 222 */ 220 223 Function FormatInteger(x As DWord, d As DWord, field As DWord, flags As FormatFlags, signChar As StrChar) As String 221 '左揃えのときまたは精度が指定されているとき、ゼロフラグは無視される。 222 If (flags And Left) Or (d <> DWORD_MAX) Then 223 flags And= Not Zero 224 End If 225 226 If d = DWORD_MAX Then 227 d = 1 228 End If 224 PreProcessFormatInteger(d, flags) 229 225 230 226 Dim sb = New System.Text.StringBuilder … … 249 245 .Append(buf, i + 1, len) 250 246 251 AdjustFieldWidth(sb, field, signChar <> 0, flags And (Not (Sign Or Blank)))247 AdjustFieldWidth(sb, field, signChar <> 0, flags) 252 248 End With 253 249 FormatInteger = sb.ToString() 254 250 End Function 255 251 252 253 /*! 254 DWordの最大値の八進法表現37777777777の文字数 - 1。FormatIntegerO内で使用。 255 */ 256 Const MaxSizeO = 10 257 258 /*! 259 @brief 整数をprintfの%o相当の変換で文字列化する関数。 260 @author Egtra 261 @date 2007/10/19 262 @param[in] x 文字列化する整数値。 263 @param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。 264 @param[in] field フィールド幅。 265 @param[in] flags 書式フラグ。 266 @return xの文字列表現 267 */ 268 Function FormatIntegerO(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String 269 PreProcessFormatInteger(d, flags) 270 271 Dim sb = New System.Text.StringBuilder 272 With sb 273 Dim buf[MaxSizeO] As StrChar 274 Dim i = MaxSizeO 275 While x <> 0 276 buf[i] = ((x And &o7) + &h30) As StrChar 277 x >>= 3 278 i-- 279 Wend 280 281 Dim len = (MaxSizeO - i) As Long 282 283 If flags And Alt Then 284 .Append(&h30 As StrChar) 285 len++ 286 End If 287 288 If len < d Then 289 .Append(&h30 As StrChar, d - len) 290 End If 291 292 .Append(buf, i + 1, len) 293 294 AdjustFieldWidth(sb, field, False, flags And (Not (Sign Or Blank))) 295 End With 296 FormatIntegerO = sb.ToString() 297 End Function 298 299 /*! 300 DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。 301 */ 302 Const MaxSizeX = 7 303 304 /*! 305 @brief 整数をprintfの%x, %X相当の変換で文字列化する関数。 306 @author Egtra 307 @date 2007/10/19 308 @param[in] x 文字列化する整数値。 309 @param[in] d 精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。 310 @param[in] field フィールド幅。 311 @param[in] flags 書式フラグ。 312 @return xの文字列表現 313 */ 314 Function FormatIntegerX(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String 315 PreProcessFormatInteger(d, flags) 316 317 Dim sb = New System.Text.StringBuilder 318 With sb 319 Dim prefixLen = 0 As DWord 320 Debug 321 If (flags And Alt) Then 322 If x <> 0 Then 323 .Append("0X") 324 prefixLen = 2 325 End If 326 End If 327 328 Dim buf[MaxSizeX] As StrChar 329 Dim i = MaxSizeX 330 While x <> 0 331 buf[i] = _System_HexadecimalTable[x And &h0f] 332 x >>= 4 333 i-- 334 Wend 335 336 Dim len = (MaxSizeX - i) As Long 337 338 If len < d Then 339 .Append(&h30 As StrChar, d - len) 340 End If 341 342 .Append(buf, i + 1, len) 343 344 AdjustFieldWidth(sb, field, False, flags And (Not (Sign Or Blank)), prefixLen) 345 End With 346 FormatIntegerX = sb.ToString() 347 348 If (flags And Cap) = 0 Then 349 FormatIntegerX = FormatIntegerX.ToLower() 350 End If 351 End Function 352 256 353 '! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。 257 354 Const MaxSizeLU = 19 258 355 259 356 /*! 357 @brief 整数変換共通の前処理 358 @author Egtra 359 @date 2007/10/19 360 @param[in, out] d 精度。DWORD_MAXで省略とみなされ、精度1になる。 361 @param[in, out] flags フラグ。精度が指定されたとき、Zeroを消す。 362 */ 363 Sub PreProcessFormatInteger(ByRef d As DWord, ByRef flags As FormatFlags) 364 If d = DWORD_MAX Then 365 d = 1 366 Else 367 '精度が指定されているとき、ゼロフラグは無視される。 368 '左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。 369 flags And= Not Zero 370 End If 371 End Sub 372 373 /*! 260 374 @brief 文字列をフィールド幅まで満たされるように空白などを挿入する。 261 @param [in,out] sb 対象文字列 262 @param [in] field フィールド幅 263 @param [in] hasSign 符号を持っている(負の値か)か否か 264 @param [in] flags フラグ 265 */ 266 Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags) 375 @param [in,out] sb 対象文字列 376 @param [in] field フィールド幅 377 @param [in] hasSign 符号を持っている(負の値か)か否か 378 @param [in] flags フラグ 379 @param [in] prefixLen (あれば)接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。 380 */ 381 Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags, prefixLen = 0 As DWord) 267 382 With sb 268 383 If .Length < field Then … … 276 391 insPos++ 277 392 End If 393 insPos += prefixLen 278 394 .Insert(insPos, String$(embeddedSize, "0")) 279 395 Else … … 282 398 End If 283 399 End If 284 285 400 End With 286 401 End Sub
Note:
See TracChangeset
for help on using the changeset viewer.