Ignore:
Timestamp:
Oct 13, 2007, 2:11:22 PM (17 years ago)
Author:
イグトランス (egtra)
Message:

FormatIntegerDを実装。
UnitTestの失敗時の表示を目立つようにした。
ArrayListを名前空間System.Collectionsに入れた。

File:
1 edited

Legend:

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

    r335 r355  
    119119        End If
    120120
    121         Dim e As Long, sign As Boolean
    122         Dim s = FloatToChars(x, e, sign)
    123 
    124         If sign Then
     121        Dim e As Long, negative As Boolean
     122        Dim s = FloatToChars(x, e, negative)
     123
     124        If negative Then
    125125            .Append("-")
    126126        Else
     
    151151        End If
    152152
    153         Dim buf[1023] As TCHAR
    154         wsprintf(buf, "%03d", e)' "%+03d", e) wsprintfは+フラグが使えない!
    155         Dim ts = New String(buf, 3)
    156         .Append(ts)
    157         '.Append(FormatLongD(e, 3, 0, Sign)
    158 
    159         If .Length < field Then
    160             Dim embeddedSize = .Length - field
    161             If flags And Left Then
    162                 .Append(&h20, embeddedSize)
    163             Else
    164                 Dim insPos As Long
    165                 If flags And Blank Then
    166                     insPos++
    167                 End If
    168                 .Insert(insPos, String$(embeddedSize, " "))
    169             End If
    170         End If
     153        .Append(FormatIntegerD(e, 2, 0, Sign Or Zero))
     154
     155        AdjustFieldWidth(sb, field, negative, flags)
    171156    End With
    172157    FormatFloatE = sb.ToString()
     
    174159
    175160'! DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
    176 Const MaxSize = 9
     161Const MaxSizeU = 9
    177162
    178163/*!
     
    187172*/
    188173Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
    189     'zero, left
    190 
     174    FormatIntegerU = FormatInteger(x, d, field, flags, 0)
     175End Function
     176
     177'! Longの最大値2147483647, -2147483648の符号部を除く文字数 - 1。FormatIntegerU内で使用。
     178Const MaxSizeD = 9
     179
     180/*!
     181@brief  符号有り整数をprintfの%u相当の変換で文字列化する関数。
     182@author Egtra
     183@date   2007/10/13
     184@param[in]  x   文字列化する整数値。
     185@param[in]  d   精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
     186@param[in]  field   フィールド幅。
     187@param[in]  flags   書式フラグ。
     188@return xの文字列表現
     189*/
     190Function FormatIntegerD(x As Long, d As DWord, field As DWord, flags As FormatFlags) As String
     191    Dim dwX As DWord
     192
     193    Dim signChar As StrChar
     194    If x < 0 Then
     195        dwX = (-x) As DWord
     196        signChar = Asc("-")
     197    Else
     198        dwX = x As DWord
     199        If flags And Sign Then
     200            signChar = Asc("+")
     201        ElseIf flags And Blank Then
     202            signChar = Asc(" ")
     203        End If
     204    End If
     205
     206    FormatIntegerD = FormatInteger(dwX, d, field, flags, signChar)
     207End Function
     208
     209/*!
     210@brief  整数をprintfの%d, %u相当の変換で文字列化する関数。
     211@author Egtra
     212@date   2007/09/18
     213@param[in]  x   文字列化する整数値。
     214@param[in]  d   精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
     215@param[in]  field   フィールド幅。
     216@param[in]  flags   書式フラグ。
     217@param[in]  signChar    符号部分の文字。\0なら存在しないとして扱われる。
     218@return xの文字列表現
     219*/
     220Function FormatInteger(x As DWord, d As DWord, field As DWord, flags As FormatFlags, signChar As StrChar) As String
    191221    '左揃えのときまたは精度が指定されているとき、ゼロフラグは無視される。
    192222    If (flags And Left) Or (d <> DWORD_MAX) Then
     
    200230    Dim sb = New System.Text.StringBuilder
    201231    With sb
    202         Dim buf[MaxSize] As StrChar
    203         Dim i = MaxSize
     232        If signChar <> 0 Then
     233            .Append(signChar)
     234        End If
     235
     236        Dim buf[MaxSizeU] As StrChar
     237        Dim i = MaxSizeU
    204238        While x <> 0
    205239            buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
     
    208242        Wend
    209243       
    210         Dim len = (MaxSize - i) As Long
     244        Dim len = (MaxSizeU - i) As Long
    211245        If len < d Then
    212246            .Append(&h30 As StrChar, d - len)
     
    215249        .Append(buf, i + 1, len)
    216250
    217         If field > len Then
    218             Dim embeddedSize = field - len
     251        AdjustFieldWidth(sb, field, signChar <> 0, flags And (Not (Sign Or Blank)))
     252    End With
     253    FormatInteger = sb.ToString()
     254End Function
     255
     256'! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
     257Const MaxSizeLU = 19
     258
     259/*!
     260@brief 文字列をフィールド幅まで満たされるように空白などを挿入する。
     261@param [in,out] sb 対象文字列
     262@param [in] field フィールド幅
     263@param [in] hasSign 符号を持っている(負の値か)か否か
     264@param [in] flags フラグ
     265*/
     266Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags)
     267    With sb
     268        If .Length < field Then
     269            Dim embeddedSize = field - .Length
    219270            If flags And Left Then
    220271                .Append(&h20, embeddedSize)
    221272            Else
    222                 .Insert(0, String$(embeddedSize, " "))
     273                Dim insPos As Long
     274                If (flags And Zero) <> 0 Then
     275                    If ((flags And Blank) Or (flags And Sign) Or hasSign) Then
     276                        insPos++
     277                    End If
     278                    .Insert(insPos, String$(embeddedSize, "0"))
     279                Else
     280                    .Insert(insPos, String$(embeddedSize, " "))
     281                End If
    223282            End If
    224283        End If
     284
    225285    End With
    226     FormatIntegerU = sb.ToString()
    227 End Function
     286End Sub
    228287
    229288End Namespace 'Detail
Note: See TracChangeset for help on using the changeset viewer.