Index: trunk/Include/basic/function.sbp
===================================================================
--- trunk/Include/basic/function.sbp	(revision 383)
+++ trunk/Include/basic/function.sbp	(revision 385)
@@ -427,30 +427,28 @@
 End Function
 
-Dim _System_ecvt_buffer[16] As StrChar
-Sub _ecvt_support(count As Long)
+Sub _ecvt_support(buf As *StrChar, count As Long, size As Long)
 	Dim i As Long
-	If _System_ecvt_buffer[count]=9 Then
-		_System_ecvt_buffer[count]=0
-		If count=0 Then
-			For i=16 To 1 Step -1
-				_System_ecvt_buffer[i]=_System_ecvt_buffer[i-1]
+	If buf[count] = 9 Then
+		buf[count] = 0
+		If count = 0 Then
+			For i = size To 1 Step -1
+				buf[i] = buf[i-1]
 			Next
-			_System_ecvt_buffer[0]=1
+			buf[0] = 1
 		Else
-			_ecvt_support(count-1)
-		End If
-	Else
-		_System_ecvt_buffer[count]++
+			_ecvt_support(buf, count-1, size)
+		End If
+	Else
+		buf[count]++
 	End If
 End Sub
-Function _ecvt(value As Double, count As Long, ByRef dec As Long, ByRef sign As Long) As *StrChar
+
+Sub _ecvt(buffer As *StrChar, value As Double, count As Long, ByRef dec As Long, ByRef sign As Boolean)
 	Dim i As Long, i2 As Long
-
-	_ecvt=_System_ecvt_buffer
 
 	'値が0の場合
 	If value = 0 Then
-		ActiveBasic.Strings.ChrFill(_System_ecvt_buffer, count As SIZE_T, &H30 As StrChar)
-		_System_ecvt_buffer[count] = 0
+		ActiveBasic.Strings.ChrFill(buffer, count As SIZE_T, &h30 As StrChar)
+		buffer[count] = 0
 		dec = 0
 		sign = 0
@@ -460,8 +458,8 @@
 	'符号の判断（同時に符号を取り除く）
 	If value < 0 Then
-		sign = 1
+		sign = True
 		value = -value
 	Else
-		sign = 0
+		sign = False
 	End If
 
@@ -477,22 +475,20 @@
 	Wend
 
-	For i=0 To count-1
-		_System_ecvt_buffer[i] = Int(value) As StrChar
-
+	For i = 0 To count - 1
+		buffer[i] = Int(value) As StrChar
 		value = (value-CDbl(Int(value))) * 10
 	Next
-	_System_ecvt_buffer[i] = 0
 
 	i--
 	If value >= 5 Then
 		'切り上げ処理
-		_ecvt_support(i)
-	End If
-
-	For i=0 To ELM(count)
-		_System_ecvt_buffer[i] += &H30
+		_ecvt_support(buffer, i, count)
+	End If
+
+	For i = 0 To count - 1
+		buffer[i] += &H30
 	Next
-	_System_ecvt_buffer[i] = 0
-End Function
+	buffer[i] = 0
+End Sub
 
 Function Str$(dbl As Double) As String
@@ -506,12 +502,10 @@
 		End If
 	End If
-	Dim dec As Long, sign As Long
-	Dim buffer[32] As StrChar, temp As *StrChar
-	Dim i As Long, i2 As Long, i3 As Long
+	Dim dec As Long, sign As Boolean
+	Dim buffer[32] As StrChar, temp[15] As StrChar
+	Dim i = 0 As Long
 
 	'浮動小数点を文字列に変換
-	temp = _ecvt(dbl, 15, dec, sign)
-
-	i=0
+	_ecvt(temp, dbl, 15, dec, sign)
 
 	'符号の取り付け
@@ -521,6 +515,6 @@
 	End If
 
-	If dec>15 Then
-		'指数表示（桁が大きい場合）
+	If dec > 15 Or dec < -3 Then
+		'指数表示
 		buffer[i] = temp[0]
 		i++
@@ -529,29 +523,11 @@
 		ActiveBasic.Strings.ChrCopy(VarPtr(buffer[i]), VarPtr(temp[1]), 14 As SIZE_T)
 		i += 14
-		buffer[i] = Asc("e")
-		i++
-		_stprintf(VarPtr(buffer[i]), "+%03d", dec - 1) 'ToDo: __STRING_UNICODE_WINDOWS_ANSI状態への対応
-
-		Return MakeStr(buffer)
-	End If
-
-	If dec < -3 Then
-		'指数表示（桁が小さい場合）
-		buffer[i] = temp[0]
-		i++
-		buffer[i] = Asc(".")
-		i++
-		ActiveBasic.Strings.ChrCopy(VarPtr(buffer[i]), VarPtr(temp[1]), 14 As SIZE_T)
-		i+=14
-		buffer[i] = Asc("e")
-		i++
-		_stprintf(VarPtr(buffer[i]), "+%03d", dec - 1) 'ToDo: __STRING_UNICODE_WINDOWS_ANSI状態への対応
-
-		Return MakeStr(buffer)
+		buffer[i] = 0
+		Return MakeStr(buffer) + ActiveBasic.Strings.SPrintf("e%+03d", New System.Int32(dec - 1))
 	End If
 
 	'整数部
-	i2=dec
-	i3=0
+	Dim i2 = dec
+	Dim i3 = 0
 	If i2>0 Then
 		While i2>0
@@ -593,79 +569,38 @@
 End Function
 
-Function Str$(i As Int64) As String
-	If i < 0 Then
-		Return "-" & Str$(-i As QWord)
-	Else
-		Return Str$(i As QWord)
-	End If
+Function Str$(x As Int64) As String
+	Imports ActiveBasic.Strings.Detail
+	Return FormatIntegerEx(TraitsIntegerD[1], x As QWord, 1, 0, None)
 End Function
 
 Function Str$(x As QWord) As String
-	If x = 0 Then
-		Return "0"
-	End If
-
-	Dim buf[20] As StrChar
-	'buf[20] = 0
-	Dim i = 19 As Long
-	Do
-		buf[i] = (x Mod 10 + &h30) As StrChar
-		x \= 10
-		If x = 0 Then
-			Exit Do
-		End If
-		i--
-	Loop
-	Return New String(VarPtr(buf[i]), 20 - i)
+	Imports ActiveBasic.Strings.Detail
+	Return FormatIntegerEx(TraitsIntegerU[1], x, 1, 0, None)
 End Function
 
 Function Str$(x As Long) As String
-#ifdef _WIN64
-	Return Str$(x As Int64)
-#else
-	If x < 0 Then
-		Return "-" & Str$(-x As DWord)
-	Else
-		Return Str$(x As DWord)
-	End If
-#endif
+	Imports ActiveBasic.Strings.Detail
+	Return FormatIntegerEx(TraitsIntegerD[0], x, 1, 0, None)
 End Function
 
 Function Str$(x As DWord) As String
-#ifdef _WIN64
-	Return Str$(x As QWord)
-#else
-	If x = 0 Then
-		Return "0"
-	End If
-
-	Dim buf[10] As StrChar
-	buf[10] = 0
-	Dim i = 9 As Long
-	Do
-		buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
-		x \= 10
-		If x = 0 Then
-			Return New String(VarPtr(buf[i]), 10 - i)
-		End If
-		i--
-	Loop	
-#endif
+	Imports ActiveBasic.Strings.Detail
+	Return FormatIntegerEx(TraitsIntegerU[0], x, 1, 0, None)
 End Function
 
 Function Str$(x As Word) As String
-	Return Str$(x As ULONG_PTR)
+	Return Str$(x As DWord)
 End Function
 
 Function Str$(x As Integer) As String
-	Return Str$(x As LONG_PTR)
+	Return Str$(x As Long)
 End Function
 
 Function Str$(x As Byte) As String
-	Return Str$(x As ULONG_PTR)
+	Return Str$(x As DWord)
 End Function
 
 Function Str$(x As SByte) As String
-	Return Str$(x As LONG_PTR)
+	Return Str$(x As Long)
 End Function
 
