線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2511
推到 Plurk!
推到 Facebook!

StrToFloat在德语版系統的怪問題

答題得分者是:eaglewolf
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-10 12:37:53 IP:58.23.xxx.xxx 訂閱
我寫的一個RS232程式,大概會碰到把字符型的"035.1"用StrTofloat轉換成浮點型的35.1,在我的中文windows下面運行都沒有問題,但是產品賣到德國去用德文版和英文版的windows卻都出錯,提示"035.1"不是一個有效的浮點類型,請問為什么?如何解決,是不是要先對字符串格式化成“35.1”?我在網上也搜索到有人問類似問題,難道StrToFloat在德語版的windows不兼容?
編輯記錄
taishyang 重新編輯於 2007-08-10 12:39:09, 註解 修改標題,將[急]字拿掉‧
oktony 重新編輯於 2007-08-10 12:53:41, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-10 14:42:54 IP:211.75.xxx.xxx 訂閱
問題其實是出在
德國的小數點符號是 "," 千位元符號是"."
剛好與一般認知相反
解決方法
一種是請user 修改控制台中 的地區及語言選項(應該不太可行)
另一種是在轉成float之前先用AnsiReplaceStr轉成德國的表示法
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-10 14:52:18 IP:61.64.xxx.xxx 訂閱
這,妙
所以必須先判斷語系
使用 GetLocaleInfo 之類的函式

===================引 用 eaglewolf 文 章===================
問題其實是出在
德國的小數點符號是 "," 千位元符號是"."
剛好與一般認知相反
解決方法
一種是請user 修改控制台中 的地區及語言選項(應該不太可行)
另一種是在轉成float之前先用AnsiReplaceStr轉成德國的表示法
編輯記錄
syntax 重新編輯於 2007-08-10 14:54:26, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-10 15:18:02 IP:60.248.xxx.xxx 未訂閱
所以先取得OS語系之數值格式
再轉換成該語系的數值格式
如此StrToFloat應會對
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-10 16:31:14 IP:220.161.xxx.xxx 訂閱
原來如此!我看了一下,世界很多地方都有各自的表示方式,那豈不是要根據每一個國家去load設置?好麻煩啊,有沒有什麽更好的方法,謝謝了!
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-10 17:12:45 IP:211.75.xxx.xxx 訂閱
syntax大大及pedro756901大大不是已經有說了嗎?
利用GetLocaleInfo函式取得該語系的數值格式
再轉換成該語系的數值格式~

===================引 用 oktony 文 章===================
原來如此!我看了一下,世界很多地方都有各自的表示方式,那豈不是要根據每一個國家去load設置?好麻煩啊,有沒有什麽更好的方法,謝謝了!
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-08-10 17:14:09, 註解 無‧
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-10 17:19:48 IP:220.161.xxx.xxx 訂閱
這個我明白,我的意思全世界有120多個語言區域,用GetLocalInfo后,是不是要根據每個區域的格式做一個很長的switch來轉換?
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-10 17:26:43 IP:60.248.xxx.xxx 未訂閱
不會啦,應會有千分位設定的值
台美千分位','
德千份位'.'

所以概念是
MyValue='035.1'
ConvertMillesimal
(
GetLocaleInfo....
Millesimal=....
Result:=ReplaceStr(MyValue,',',Milesimal)
)
這部分可能你要去查MSDN及Win32 API,去實作
編輯記錄
 重新編輯於 2007-08-10 17:28:01, 註解 無‧
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-10 17:28:32 IP:211.22.xxx.xxx 未訂閱
這是個好問題~
況且目前的討論也沒解決我這個旁觀者的疑惑!英文語系的數值表示法不是跟我們也一樣嗎?為何英文版的也不行?除非德國人使用英文版去控制台調整數值的表示法後才造成錯誤?!那可見調整控制台是有用的囉?!小弟資質努鈍,看得有點花了。
===================引 用 oktony 文 章===================
這個我明白,我的意思全世界有120多個語言區域,用GetLocalInfo后,是不是要根據每個區域的格式做一個很長的switch來轉換?
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-10 17:37:08 IP:220.161.xxx.xxx 訂閱
在windows控制面板的區域和語言選項中的區域選項可以看到有120多個區域設置,每個區域對應的數字表現形式都有不同,在下方的示例可以看到,雖然就是小數點“,”和"."這兩種表示方式而已,但是我覺得GetLocalInfo后每個區域都要去一一對應設置也覺得很麻煩耶,這邊有篇文章講解http://www.utf.com.cn/article/s13-2,里面談到TsiLang這個插件,但是我還不會用...

調控制臺是有用,但總不能叫每個用戶去改成指定區域..stallion版主太謙虛了,要test這個問題,只要在控制面板把區域改成德國,然后放一個button在form里,寫strtofloat('2.33')運行后即可發現出錯
編輯記錄
oktony 重新編輯於 2007-08-10 17:46:13, 註解 無‧
oktony 重新編輯於 2007-08-10 17:49:59, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-10 18:05:25 IP:211.75.xxx.xxx 訂閱
利用 GetLocaleInfo 取得 strThousand(千位元符號),strDot(小數點符號) , strNegative(負數符號)等

strData := AnsiReplaceStr(strData,',', '%THOUSAND%');
strData := AnsiReplaceStr(strData,'.', '%DOT%');
strData := AnsiReplaceStr(strData,'-', '%NEGATIVE%');

strData := AnsiReplaceStr(strData,'%THOUSAND%', strThousand');
strData := AnsiReplaceStr(strData,'%DOT%', strDot);
strData := AnsiReplaceStr(strData,'%NEGATIVE%', strNegative);

fltData := StrToFloat(strData);

===================引 用 oktony 文 章===================
這個我明白,我的意思全世界有120多個語言區域,用GetLocalInfo后,是不是要根據每個區域的格式做一個很長的switch來轉換?
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-10 19:54:06 IP:58.23.xxx.xxx 訂閱
謝謝!這里很溫暖。
另外多問一個問題,像℃這種全角的符號有沒有辦法在德文系統顯示?我看是亂碼
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-08-11 00:22:28 IP:61.31.xxx.xxx 訂閱
我不懂為什麼不這樣做。
var
SaveSeparator: Char;
begin
SaveSeparator:= DecimalSeparator;
try
DecimalSeparator:= '.';
Value := Strtofloat('035.1');
finally
DecimalSeparator:= SaveSeparator;
end;
end;

ThousandSeparator、DecimalSeparator 以取好在 Sysutils
oktony
中階會員


發表:67
回覆:132
積分:64
註冊:2004-12-05

發送簡訊給我
#14 引用回覆 回覆 發表時間:2007-08-11 08:28:00 IP:220.161.xxx.xxx 訂閱
謝謝wameng大大,您的方法很妙,非常感謝
系統時間:2024-04-28 16:43:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!