Index: trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 364)
+++ trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 365)
@@ -39,5 +39,4 @@
 		x = -x
 	Else
-
 		sign = False
 	End If
@@ -65,5 +64,5 @@
 	e = d
 
-	FloatToChars = Str$(x As QWord)
+	FloatToChars = FormatIntegerLU((x As Int64) As QWord, 17, 0, None)
 End Function
 
@@ -102,4 +101,10 @@
 	'! 大文字。使用するアルファベットを大文字にする。[aefgx]を[AEFGX]化する。
 	Cap = &h20
+
+	/*!
+	内部処理用に予約。
+	@note	Minusとして使用されている。
+	*/
+	Reserved = &h80000000
 End Enum
 
@@ -108,11 +113,11 @@
 @author	Egtra
 @date	2007/09/18
-@param[in]	x	文字列化する浮動小数点数値。
-@param[in]	d	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
-@param[in]	field	フィールド幅。
-@param[in]	flags	書式フラグ。
-@return xの文字列表現
-
-@todo 他の実装での末尾桁の扱いを調べる（このコードでは何もしていないので切捨となっている）。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] d	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in] field	フィールド幅。
+@param[in] flags	書式フラグ。
+@return	xの文字列表現
+
+@todo	他の実装での末尾桁の扱いを調べる（このコードでは何もしていないので切捨となっている）。
 */
 Function FormatFloatE(x As Double, d As DWord, field As DWord, flags As FormatFlags) As String
@@ -156,5 +161,5 @@
 
 /*!
-@brief	浮動小数点数をprintfの%f（小数点数形式、十進法）相当の変換で文字列化する関数。
+@brief	浮動小数点数をprintfの%f（小数形式、十進法）相当の変換で文字列化する関数。
 @author	Egtra
 @date	2007/10/23
@@ -238,5 +243,9 @@
 End Sub
 
-'! DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
+/*!
+@brief	DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
+@author	Egtra
+@date	2007/09/18
+*/
 Const MaxSizeU = 9
 
@@ -252,12 +261,15 @@
 */
 Function FormatIntegerU(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	FormatIntegerU = FormatInteger(x, d, field, flags And (Not (Sign Or Blank)), 0)
-End Function
-
-/*!
-DWordの最大値4294967295やLongの最大値2147483647、最小値-2147483648
-（全て十進法）の符号部を除いた文字数 - 1。FormatIntegerU内で使用。
-*/
-Const MaxSizeD = 9
+	Return FormatIntegerEx(TraitsIntegerDU, x, d, field, flags And (Not (Sign Or Blank)))
+End Function
+
+/*!
+@brief	FormatIntegerUのQWord版
+@author	Egtra
+@date	2007/10/26
+*/
+Function FormatIntegerLU(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	Return FormatIntegerEx(TraitsIntegerLDU, x, d, field, flags And (Not (Sign Or Blank)))
+End Function
 
 /*!
@@ -272,72 +284,126 @@
 */
 Function FormatIntegerD(x As Long, d As DWord, field As DWord, flags As FormatFlags) As String
-	Dim dwX As DWord
-
-	Dim signChar As StrChar
+	Dim unsignedX As DWord
 	If x < 0 Then
-		dwX = (-x) As DWord
-		signChar = Asc("-")
-		flags Or= Sign
+		unsignedX = (-x) As DWord
+		flags Or= Minus
 	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の文字列表現
-
-signCharに何らかの値を指定するときには、必ずflagsにSignまたはBlankを指定すること。
-さもないと、フィールド幅を指定したときに正しく整形されなくなる。
-*/
-Function FormatInteger(x As DWord, d As DWord, field As DWord, flags As FormatFlags, signChar As StrChar) As String
-	PreProcessFormatInteger(d, flags)
-
-	Dim sb = New System.Text.StringBuilder
-	With sb
-		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対策
-			x \= 10
-			i--
-		Wend
-		
-		Dim len = (MaxSizeU - i) As Long
-		If len < d Then
-			.Append(&h30 As StrChar, d - len)
-		End If
-
-		.Append(buf, i + 1, len)
-
-		AdjustFieldWidth(sb, field, flags)
-	End With
-	FormatInteger = sb.ToString()
-End Function
-
-/*!
-DWordの最大値の八進法表現37777777777の文字数 - 1 + 1。FormatIntegerO内で使用。
+		unsignedX = x As DWord
+	End If
+
+	Return FormatIntegerEx(TraitsIntegerDU, unsignedX, d, field, flags)
+End Function
+
+/*!
+@brief	FormatIntegerDのInt64版
+@author	Egtra
+@date	2007/10/26
+*/
+Function FormatIntegerLD(x As Int64, d As DWord, field As DWord, flags As FormatFlags) As String
+	Dim unsignedX As QWord
+	If x < 0 Then
+		unsignedX = (-x) As QWord
+		flags Or= Minus
+	Else
+		unsignedX = x As QWord
+	End If
+
+	Return FormatIntegerEx(TraitsIntegerLDU, unsignedX, d, field, flags)
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/26
+*/
+Dim TraitsIntegerDU As IntegerConvertTraits
+With TraitsIntegerDU
+	.Convert = AddressOf(IntegerDU_Convert)
+	.Prefix = AddressOf(IntegerDU_Prefix)
+	.MaxSize = MaxSizeU
+End With
+
+/*!
+@author	Egtra
+@date	2007/10/26
+*/
+Dim TraitsIntegerLDU As IntegerConvertTraits
+With TraitsIntegerLDU
+	.Convert = AddressOf(IntegerLDU_Convert)
+	.Prefix = AddressOf(IntegerDU_Prefix)
+	.MaxSize = MaxSizeLU
+End With
+
+/*!
+@brief	負数を表すフラグ。FormatIntegerD, LDからIntegerDU_Prefixまでの内部処理用。
+@author	Egtra
+@date	2007/10/26
+*/
+Const Minus = Reserved
+
+/*!
+@author	Egtra
+@date	2007/10/26
+*/
+Function IntegerDU_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
+	Dim x = xq As DWord
+	Dim i = MaxSizeU
+	While x <> 0
+		buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
+		x \= 10
+		i--
+	Wend
+	Return i
+End Function
+
+/*!
+@brief	IntegerDU_ConvertのQWord版
+@author	Egtra
+@date	2007/10/26
+@bug	#117のため、現在Int64の最大値を超える値を正しく処理できない。
+*/
+Function IntegerLDU_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLU
+	While x <> 0
+		buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
+		x \= 10
+		i--
+	Wend
+	Return i
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/26
+*/
+Function IntegerDU_Prefix(x As QWord, flags As FormatFlags) As String
+	If flags And Minus Then
+		IntegerDU_Prefix = "-"
+	ElseIf flags And Sign Then
+		IntegerDU_Prefix = "+"
+	ElseIf flags And Blank Then
+		IntegerDU_Prefix = " "
+	End If
+End Function
+
+/*!
+@brief	DWordの最大値の八進法表現37777777777の文字数 - 1 + 1。IntegerO_Convert内で使用。
+@author	Egtra
+@date	2007/10/19
 上の式で1を加えているのは、八進接頭辞の分。
 */
 Const MaxSizeO = 11
 
+/*!
+@brief	QWordの最大値の八進法表現1777777777777777777777の文字数 - 1 + 1。IntegerO_Convert内で使用。
+@author	Egtra
+@date	2007/10/26
+上の式で1を加えているのは、八進接頭辞の分。
+*/
+Const MaxSizeLO = 22
+
+/*!
+@author	Egtra
+@date	2007/10/22
+*/
 Dim TraitsIntegerO As IntegerConvertTraits
 With TraitsIntegerO
@@ -348,4 +414,15 @@
 
 /*!
+@author	Egtra
+@date	2007/10/26
+*/
+Dim TraitsIntegerLO As IntegerConvertTraits
+With TraitsIntegerLO
+	.Convert = AddressOf(IntegerLO_Convert)
+	.Prefix = AddressOf(IntegerO_Prefix)
+	.MaxSize = MaxSizeLO
+End With
+
+/*!
 @brief	符号無し整数をprintfの%o（八進法表現）相当の変換で文字列化する関数。
 @author	Egtra
@@ -358,7 +435,20 @@
 */
 Function FormatIntegerO(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	FormatIntegerO = FormatIntegerEx(TraitsIntegerO, x, d, field, flags)
-End Function
-
+	Return FormatIntegerEx(TraitsIntegerO, x, d, field, flags)
+End Function
+
+/*!
+@brief	FormatIntegerOのQWord版。
+@author	Egtra
+@date	2007/10/26
+*/
+Function FormatIntegerLO(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	Return FormatIntegerEx(TraitsIntegerLO, x, d, field, flags)
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/22
+*/
 Function IntegerO_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
 	Dim x = xq As DWord
@@ -373,15 +463,52 @@
 		i--
 	End If
-	IntegerO_Convert = i
-End Function
-
+	Return i
+End Function
+
+/*!
+@brief	IntegerO_ConvertのQWord版。
+@author	Egtra
+@date	2007/10/26
+*/
+Function IntegerLO_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLO
+	While x <> 0
+		buf[i] = ((x And &o7) + &h30) As StrChar
+		x >>= 3
+		i--
+	Wend
+	If flags And Alt Then
+		buf[i] = &h30
+		i--
+	End If
+	Return i
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/22
+@note	#フラグ (Alt)の処理は、IntegerO/LO_Convert内で行うので、ここで処理することはない。
+*/
 Function IntegerO_Prefix(x As QWord, flags As FormatFlags) As String
 End Function
 
 /*!
-DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
+@brief	DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
+@author	Egtra
+@date	2007/10/24
 */
 Const MaxSizeX = 7
 
+/*!
+@brief	QWordの最大値の十六進法表現ffffffffffffffffの文字数 - 1。FormatIntegerO内で使用。
+@author	Egtra
+@date	2007/10/26
+*/
+Const MaxSizeLX = 15
+
+/*!
+@author	Egtra
+@date	2007/10/24
+*/
 Dim TraitsIntegerX As IntegerConvertTraits
 With TraitsIntegerX
@@ -392,4 +519,15 @@
 
 /*!
+@author	Egtra
+@date	2007/10/26
+*/
+Dim TraitsIntegerLX As IntegerConvertTraits
+With TraitsIntegerLX
+	.Convert = AddressOf(IntegerLX_Convert)
+	.Prefix = AddressOf(IntegerX_Prefix)
+	.MaxSize = MaxSizeLX
+End With
+
+/*!
 @brief	整数をprintfの%x, %X（十六進法）相当の変換で文字列化する関数。
 @author	Egtra
@@ -402,7 +540,20 @@
 */
 Function FormatIntegerX(x As DWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	FormatIntegerX = FormatIntegerEx(TraitsIntegerX, x, d, field, flags)
-End Function
-
+	Return FormatIntegerEx(TraitsIntegerX, x, d, field, flags)
+End Function
+
+/*!
+@brief	FormatIntegerXのQWord版。
+@author	Egtra
+@date	2007/10/22
+*/
+Function FormatIntegerLX(x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	Return FormatIntegerEx(TraitsIntegerLX, x, d, field, flags)
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/22
+*/
 Function IntegerX_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
 	Dim i = MaxSizeX
@@ -413,7 +564,26 @@
 		i--
 	Wend
-	IntegerX_Convert = i
-End Function
-
+	Return i
+End Function
+
+/*!
+@brief	IntegerX_ConvertのQWord版。
+@author	Egtra
+@date	2007/10/22
+*/
+Function IntegerLX_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLX
+	While x <> 0
+		buf[i] = _System_HexadecimalTable[x And &h0f]
+		x >>= 4
+		i--
+	Wend
+	Return i
+End Function
+
+/*!
+@author	Egtra
+@date	2007/10/24
+*/
 Function IntegerX_Prefix(x As QWord, flags As FormatFlags) As String
 	If flags And Alt Then
@@ -424,7 +594,15 @@
 End Function
 
+/*!
+@brief	FormatIntegerExへ渡す変換特性を表す構造体型。
+@author	Egtra
+@date	2007/10/22
+*/
 Type IntegerConvertTraits
+	'!変換を行う関数へのポインタ。
 	Convert As *Function(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+	'!接頭辞を取得する関数へのポインタ。
 	Prefix As *Function(x As QWord, flags As FormatFlags) As String
+	'!必要なバッファの大きさ。
 	MaxSize As DWord
 End Type
@@ -441,5 +619,11 @@
 */
 Function FormatIntegerEx(ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
-	PreProcessFormatInteger(d, flags)
+	If d = DWORD_MAX Then
+		d = 1
+	Else
+		'精度が指定されているとき、ゼロフラグは無視される。
+		'仕様上、左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。
+		flags And= Not Zero
+	End If
 
 	Dim sb = New System.Text.StringBuilder
@@ -459,4 +643,7 @@
 
 		Dim len = (tr.MaxSize - bufStartPos) As Long
+		If len < 0 Then
+			Debug
+		End If
 		If len < d Then
 			.Append(&h30 As StrChar, d - len)
@@ -474,31 +661,20 @@
 End Function
 
-'! QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
+/*!
+@brief	QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
+@author	Egtra
+@date	2007/09/18
+*/
 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	フラグ
-@param [in]	prefixLen	（あれば）接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。
+@brief	文字列をフィールド幅まで満たされるように空白などを挿入する。
+@author	Egtra
+@date	2007/10/13
+@param[in,out] sb	対象文字列
+@param[in] field	フィールド幅
+@param[in] hasSign	符号を持っている（負の値か）か否か
+@param[in] flags	フラグ
+@param[in] prefixLen	（あれば）接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。
 sbが"-1"のように負符号を持っている場合は、呼出元でSignフラグ（またはBlank）を立てること。
 */
