Ignore:
Timestamp:
Oct 19, 2007, 11:42:51 PM (17 years ago)
Author:
イグトランス (egtra)
Message:

FormatIntegerO, FormatIntegerXを実装

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab

    r355 r358  
    9090    /*! 代替表記、#。
    9191    <ul>
    92         <li>[OoXx]では、数値の先頭に0、0xを付ける。</ul>
     92        <li>[OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul>
    9393        <li>[AaEeFfGg]では、精度0でも小数点を付ける。</ul>
    9494        <li>[Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul>
     
    172172*/
    173173Function 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)
     175End Function
     176
     177/*!
     178DWordの最大値4294967295やLongの最大値2147483647、最小値-2147483648
     179(全て十進法)の符号部を除いた文字数 - 1。FormatIntegerU内で使用。
     180*/
    178181Const MaxSizeD = 9
    179182
     
    219222*/
    220223Function 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)
    229225
    230226    Dim sb = New System.Text.StringBuilder
     
    249245        .Append(buf, i + 1, len)
    250246
    251         AdjustFieldWidth(sb, field, signChar <> 0, flags And (Not (Sign Or Blank)))
     247        AdjustFieldWidth(sb, field, signChar <> 0, flags)
    252248    End With
    253249    FormatInteger = sb.ToString()
    254250End Function
    255251
     252
     253/*!
     254DWordの最大値の八進法表現37777777777の文字数 - 1。FormatIntegerO内で使用。
     255*/
     256Const 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*/
     268Function 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()
     297End Function
     298
     299/*!
     300DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
     301*/
     302Const 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*/
     314Function 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
     351End Function
     352
    256353'! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
    257354Const MaxSizeLU = 19
    258355
    259356/*!
     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*/
     363Sub 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
     371End Sub
     372
     373/*!
    260374@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*/
     381Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags, prefixLen = 0 As DWord)
    267382    With sb
    268383        If .Length < field Then
     
    276391                        insPos++
    277392                    End If
     393                    insPos += prefixLen
    278394                    .Insert(insPos, String$(embeddedSize, "0"))
    279395                Else
     
    282398            End If
    283399        End If
    284 
    285400    End With
    286401End Sub
Note: See TracChangeset for help on using the changeset viewer.