Index: trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 355)
+++ trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 358)
@@ -90,5 +90,5 @@
 	/*! 代替表記、#。
 	<ul>
-		<li>[OoXx]では、数値の先頭に0、0xを付ける。</ul>
+		<li>[OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul>
 		<li>[AaEeFfGg]では、精度0でも小数点を付ける。</ul>
 		<li>[Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul>
@@ -172,8 +172,11 @@
 */
 Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	FormatIntegerU = FormatInteger(x, d, field, flags, 0)
-End Function
-
-'! Longの最大値2147483647, -2147483648の符号部を除く文字数 - 1。FormatIntegerU内で使用。
+	FormatIntegerU = FormatInteger(x, d, field, flags And (Not (Sign Or Blank)), 0)
+End Function
+
+/*!
+DWordの最大値4294967295やLongの最大値2147483647、最小値-2147483648
+（全て十進法）の符号部を除いた文字数 - 1。FormatIntegerU内で使用。
+*/
 Const MaxSizeD = 9
 
@@ -219,12 +222,5 @@
 */
 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
-		flags And= Not Zero
-	End If
-
-	If d = DWORD_MAX Then
-		d = 1
-	End If
+	PreProcessFormatInteger(d, flags)
 
 	Dim sb = New System.Text.StringBuilder
@@ -249,20 +245,139 @@
 		.Append(buf, i + 1, len)
 
-		AdjustFieldWidth(sb, field, signChar <> 0, flags And (Not (Sign Or Blank)))
+		AdjustFieldWidth(sb, field, signChar <> 0, flags)
 	End With
 	FormatInteger = sb.ToString()
 End Function
 
+
+/*!
+DWordの最大値の八進法表現37777777777の文字数 - 1。FormatIntegerO内で使用。
+*/
+Const MaxSizeO = 10
+
+/*!
+@brief	整数をprintfの%o相当の変換で文字列化する関数。
+@author	Egtra
+@date	2007/10/19
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+@return xの文字列表現
+*/
+Function FormatIntegerO(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	PreProcessFormatInteger(d, flags)
+
+	Dim sb = New System.Text.StringBuilder
+	With sb
+		Dim buf[MaxSizeO] As StrChar
+		Dim i = MaxSizeO
+		While x <> 0
+			buf[i] = ((x And &o7) + &h30) As StrChar
+			x >>= 3
+			i--
+		Wend
+		
+		Dim len = (MaxSizeO - i) As Long
+
+		If flags And Alt Then
+			.Append(&h30 As StrChar)
+			len++
+		End If
+
+		If len < d Then
+			.Append(&h30 As StrChar, d - len)
+		End If
+
+		.Append(buf, i + 1, len)
+
+		AdjustFieldWidth(sb, field, False, flags And (Not (Sign Or Blank)))
+	End With
+	FormatIntegerO = sb.ToString()
+End Function
+
+/*!
+DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
+*/
+Const MaxSizeX = 7
+
+/*!
+@brief	整数をprintfの%x, %X相当の変換で文字列化する関数。
+@author	Egtra
+@date	2007/10/19
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+@return xの文字列表現
+*/
+Function FormatIntegerX(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	PreProcessFormatInteger(d, flags)
+
+	Dim sb = New System.Text.StringBuilder
+	With sb
+		Dim prefixLen = 0 As DWord
+		Debug
+		If (flags And Alt) Then
+			If x <> 0 Then
+				.Append("0X")
+				prefixLen = 2
+			End If
+		End If
+
+		Dim buf[MaxSizeX] As StrChar
+		Dim i = MaxSizeX
+		While x <> 0
+			buf[i] = _System_HexadecimalTable[x And &h0f]
+			x >>= 4
+			i--
+		Wend
+		
+		Dim len = (MaxSizeX - i) As Long
+
+		If len < d Then
+			.Append(&h30 As StrChar, d - len)
+		End If
+
+		.Append(buf, i + 1, len)
+
+		AdjustFieldWidth(sb, field, False, flags And (Not (Sign Or Blank)), prefixLen)
+	End With
+	FormatIntegerX = sb.ToString()
+	
+	If (flags And Cap) = 0 Then
+		FormatIntegerX = FormatIntegerX.ToLower()
+	End If
+End Function
+
 '! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
 Const MaxSizeLU = 19
 
 /*!
+@brief 整数変換共通の前処理
+@author	Egtra
+@date	2007/10/19
+@param[in, out] d	精度。DWORD_MAXで省略とみなされ、精度1になる。
+@param[in, out] flags	フラグ。精度が指定されたとき、Zeroを消す。
+*/
+Sub PreProcessFormatInteger(ByRef d As DWord, ByRef flags As FormatFlags)
+	If d = DWORD_MAX Then
+		d = 1
+	Else
+		'精度が指定されているとき、ゼロフラグは無視される。
+		'左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。
+		flags And= Not Zero
+	End If
+End Sub
+
+/*!
 @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)
+@param [in,out]	sb	対象文字列
+@param [in]	field	フィールド幅
+@param [in] hasSign	符号を持っている（負の値か）か否か
+@param [in]	flags	フラグ
+@param [in]	prefixLen	（あれば）接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。
+*/
+Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, hasSign As Boolean, flags As FormatFlags, prefixLen = 0 As DWord)
 	With sb
 		If .Length < field Then
@@ -276,4 +391,5 @@
 						insPos++
 					End If
+					insPos += prefixLen
 					.Insert(insPos, String$(embeddedSize, "0"))
 				Else
@@ -282,5 +398,4 @@
 			End If
 		End If
-
 	End With
 End Sub
