2012-03-21 13 views
3

私は長い間C#デベロッパーであり、最近VB6コードをいくつか見なければなりませんでした。いくつかの掘り出した後、我々はどこかで、何とかして、数字を文字列として保存していることを発見しました。今、私たちはそれを読んでおり、私たちのコードは文化の違いをうまく処理していません。次に例を示します。これは、VB6とNOT VB.NETであることを念頭に置いてVB6 - 特定のカルチャを使用して文字列を倍精度に変換しますか?

Dim text as String 
Dim myVal as Double 
Set text = "1,123456" 
'This sets the value of myVal to 1123456 on our system - incorrect 
myVal = text 

Set text = "1.123456" 
'This sets the value of myVal to 1.123456 on our system - correct 
myVal = text 

キーピング、特定のカルチャを使用して、二重に文字列を変換することができます任意のビルトインメソッド、関数、何がありますか? 少なくとも、私たちが別のフォーマットを扱っている可能性のある変換を示唆していますか?

値がどのように書き込まれているかを把握しており、プロセスをリバースエンジニアリングして一貫した結果を得ることができるかどうかを確認しています。しかし、私たちの顧客はすでにデータをある形式か他の形か(または両方をチェックしています)、適切な変換アルゴリズムまたは実装が現時点でより良い答えになるでしょう。

+0

変換する方法を知るためには、その番号がどこから来たのかについていくつかのコンテキストが必要です。非常に単純な方法については、 'Val()'に渡します。もちろん、もしあなたが12,345.67を得れば、あなたはうんざりです。 – Deanna

答えて

7

過去にこのクイックダーティー関数を使用して、テキストからダブルを取得しました。アルゼンチンでは、小数点を区切るためにポイントと時にはカンマを使用することがあるため、この関数は両方の形式を受け入れる準備ができています。句読点が1つしかない場合は、それが小数点区切り文字であるとみなされます。

function ConvertDBL(texto) 
    dim retval, SepDecimal, SepMiles 
    If texto = "" then texto = "0" 
    retval = replace(trim(texto), " ", "") 
    If cdbl("3,24") = 324 then 
     SepDecimal = "." 
     SepMiles = "," 
    else 
     SepDecimal = "," 
     SepMiles = "." 
    end if 
    If InStr(Retval, SepDecimal) > 0 then 
     If InStr(Retval, SepMiles) > 0 then 
      If InStr(Retval, SepDecimal) > InStr(Retval, SepMiles) then 
       Retval = replace(Retval, SepMiles, "") 
      else 
       Retval = replace(Retval, SepDecimal, "") 
       Retval = replace(Retval, SepMiles, SepDecimal) 
      end if 
     end if  
    else 
     Retval = replace(Retval, SepMiles, SepDecimal) 
    end if 
    ConvertDbl = cdbl(retval) 
end function 
+0

お返事ありがとうございます。私はそれをそのまま使用することはできませんが、 "3,24"に変換してあなたの文化を検出しようとする検出メカニズムはちょうど天才です!ミュシャ・グラシアス!追加情報ありがとうございました –

2

.Netのようにカルチャオブジェクトを渡して、任意のカルチャを選択することはできません。

  • 現在の地域設定を常に使用する機能。 CStrFormatCDblなどです。暗黙のコンバージョン(あなたの質問にあるようなもの)は、現在の地域設定も使用します。
  • 米国の地域設定を常に使用する機能(.Net不変の文化に似ています)。 Str,Val

通常、現在の地域設定はコントロールパネルから取得されます。 rumoursSetThreadLocaleと呼ぶと、実行時にコードから地域の設定を変更することができます。自分で試したことはありません。

+0

私たちはそのような制限を認識しています。しかし、何らかの理由でデータが顧客のデータベースにさまざまな形式で格納されてしまいました。ユーザーの中には、USではないにもかかわらずen-USを文化として使用する方が好きです。ですから、基本的に、VB6では1.2345dとして "1,2345"か "1.2345"のいずれかを解析できる必要があります。はい、私たちは、特定の文化では、その2つの表記がまったく異なるものを意味することを認識しています。しかし、私たちの特別な状況では、10進数だけがデータベースに格納されていると確信しています。あなたのご意見ありがとうございます。 –

+0

フォーマットを検出し、それに応じて処理してみますか?このようなもの? bDotとbComma Then Err.Raise vbObjectError + 512、 "ドットとカンマで値を処理できません"と表示されている場合、bDot =(Instr(test、 "。")> 0)bComma =(Instr(test、 "、">もしbCommaならばtest = Replace(test、 "、"、 "。")End value = Val(test) – MarkJ

+0

あなたは正しいです。ほとんどの場合、Eduardoのコードで処理できます。トリッキーなケースは1,234で、1.234とは思えません。桁区切りとして "、"を使用する文化では1234である可能性があります。一貫性のないデータがデータベースにどのように組み込んだのかを理解したいので、1,234が常に1.234を意味するかどうか、あるいは1234を意味するケースがあると考えるべきであるかどうかについて、より教育的な推測をすることができます。 –

関連する問題