Index: trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 335)
+++ trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 355)
@@ -119,8 +119,8 @@
 		End If
 
-		Dim e As Long, sign As Boolean
-		Dim s = FloatToChars(x, e, sign)
-
-		If sign Then
+		Dim e As Long, negative As Boolean
+		Dim s = FloatToChars(x, e, negative)
+
+		If negative Then
 			.Append("-")
 		Else
@@ -151,22 +151,7 @@
 		End If
 
-		Dim buf[1023] As TCHAR
-		wsprintf(buf, "%03d", e)' "%+03d", e) wsprintfは+フラグが使えない！
-		Dim ts = New String(buf, 3)
-		.Append(ts)
-		'.Append(FormatLongD(e, 3, 0, Sign)
-
-		If .Length < field Then
-			Dim embeddedSize = .Length - field
-			If flags And Left Then
-				.Append(&h20, embeddedSize)
-			Else
-				Dim insPos As Long
-				If flags And Blank Then
-					insPos++
-				End If
-				.Insert(insPos, String$(embeddedSize, " "))
-			End If
-		End If
+		.Append(FormatIntegerD(e, 2, 0, Sign Or Zero))
+
+		AdjustFieldWidth(sb, field, negative, flags)
 	End With
 	FormatFloatE = sb.ToString()
@@ -174,5 +159,5 @@
 
 '! DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
-Const MaxSize = 9
+Const MaxSizeU = 9
 
 /*!
@@ -187,6 +172,51 @@
 */
 Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	'zero, left
-
+	FormatIntegerU = FormatInteger(x, d, field, flags, 0)
+End Function
+
+'! Longの最大値2147483647, -2147483648の符号部を除く文字数 - 1。FormatIntegerU内で使用。
+Const MaxSizeD = 9
+
+/*!
+@brief	符号有り整数をprintfの%u相当の変換で文字列化する関数。
+@author	Egtra
+@date	2007/10/13
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+@return xの文字列表現
+*/
+Function FormatIntegerD(x As Long, d As DWord, field As DWord, flags As FormatFlags) As String
+	Dim dwX As DWord
+
+	Dim signChar As StrChar
+	If x < 0 Then
+		dwX = (-x) As DWord
+		signChar = Asc("-")
+	Else
+		dwX = x As DWord
+		If flags And Sign Then
+			signChar = Asc("+")
+		ElseIf flags And Blank Then
+			signChar = Asc(" ")
+		End If
+	End If
+
+	FormatIntegerD = FormatInteger(dwX, d, field, flags, signChar)
+End Function
+
+/*!
+@brief	整数をprintfの%d, %u相当の変換で文字列化する関数。
+@author	Egtra
+@date	2007/09/18
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+@param[in]	signChar	符号部分の文字。\0なら存在しないとして扱われる。
+@return xの文字列表現
+*/
+Function FormatInteger(x As DWord, d As DWord, field As DWord, flags As FormatFlags, signChar As StrChar) As String
 	'左揃えのときまたは精度が指定されているとき、ゼロフラグは無視される。
 	If (flags And Left) Or (d <> DWORD_MAX) Then
@@ -200,6 +230,10 @@
 	Dim sb = New System.Text.StringBuilder
 	With sb
-		Dim buf[MaxSize] As StrChar
-		Dim i = MaxSize
+		If signChar <> 0 Then
+			.Append(signChar)
+		End If
+
+		Dim buf[MaxSizeU] As StrChar
+		Dim i = MaxSizeU
 		While x <> 0
 			buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
@@ -208,5 +242,5 @@
 		Wend
 		
-		Dim len = (MaxSize - i) As Long
+		Dim len = (MaxSizeU - i) As Long
 		If len < d Then
 			.Append(&h30 As StrChar, d - len)
@@ -215,15 +249,40 @@
 		.Append(buf, i + 1, len)
 
-		If field > len Then
-			Dim embeddedSize = field - len
+		AdjustFieldWidth(sb, field, signChar <> 0, flags And (Not (Sign Or Blank)))
+	End With
+	FormatInteger = sb.ToString()
+End Function
+
+'! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
+Const MaxSizeLU = 19
+
+/*!
+@brief 文字列をフィールド幅まで満たされるように空白などを挿入する。
+@param [in,out]	sb 対象文字列
+@param [in]	field フィールド幅
+@param [in] hasSign 符号を持っている（負の値か）か否か
+@param [in] flags フラグ
+*/
+Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags)
+	With sb
+		If .Length < field Then
+			Dim embeddedSize = field - .Length
 			If flags And Left Then
 				.Append(&h20, embeddedSize)
 			Else
-				.Insert(0, String$(embeddedSize, " "))
+				Dim insPos As Long
+				If (flags And Zero) <> 0 Then
+					If ((flags And Blank) Or (flags And Sign) Or hasSign) Then
+						insPos++
+					End If
+					.Insert(insPos, String$(embeddedSize, "0"))
+				Else
+					.Insert(insPos, String$(embeddedSize, " "))
+				End If
 			End If
 		End If
+
 	End With
-	FormatIntegerU = sb.ToString()
-End Function
+End Sub
 
 End Namespace 'Detail
