2

2 つの場所で使用されるクライアント用のアプリを維持しています。イングランドに1つ、ポーランドに1つ。

データベースはイギリスに保存され、通貨に £1000.00 の形式を使用していますが、情報はポーランドでローカルに収集されており、1000,00 が形式です。

私の質問は、VB6 に、通貨文字列をローカル形式で取り、別の形式に変換する関数があるか、または文字列を解析して , または を置き換えるだけでよいかということです。?

ところで、私はCCurを見てきましたが、それが私が望むことをするかどうかはわかりません.

4

4 に答える 4

8

データは実際には文字列として保存されません"£1000.00"。何らかの数値形式で保存されます。

サイドバー:通常、データベースは、 10 進データ型 (一部の DB ではmoneyとも呼ばれます) または浮動小数点数 ( doubleとも呼ばれます)のいずれかを使用して金額を格納するように設定されています。

違いは、10 進数で格納すると 0.01 のような特定の数値が正確に表現されるのに対し、2 倍ではこれらの数値はおおよそしか格納できないため、丸め誤差が発生することです。

何かが表示用にフォーマットしているため、データベースは数値を保存しているように見えます。"£1000.00"VB6 には、FormatCurrency1000 のような数値を取り、 のような文字列を返す関数があります"£1000.00"

このFormatCurrency関数は、使用する通貨の種類を指定する引数を取りません。これは、VB の他のすべてのロケール固有の関数と共に、システムの現在のロケール (Windows コントロール パネル) から通貨を計算するためです。

つまり、私のシステムでは、

Debug.Print FormatCurrency(1000)

は印刷されます$1,000.00が、同じプログラムを英国ロケールに設定された Windows コンピューターで実行すると、おそらく が印刷されます£1,000.00。もちろん、これはまったく別のものです。

同様に、ユーザーの文字列を解析して数値に変換するコードがポーランドのどこにあるのかわかりません。また、そのコードが Visual Basic の場合も、"." かどうかを決定するためにコントロール パネルに依存しています。または "," は千単位の区切り記号であり、"," または "." のいずれかです。は小数点です。

この関数CDblは、引数を数値に変換します。たとえば、米国の私のシステムでは

Debug.Print CDbl("1.200")

コントロール パネルがヨーロッパ形式に設定されているシステムでは、数字の 1 と 2 が生成されます。

問題は、「.」を使用するように設定された地域コントロール パネルを使用してコンピュータに座っている人がいる可能性があります。小数点記号として使用されていますが、小数点記号として「,」と入力しています。

于 2008-08-21T13:40:13.540 に答える
0

カルチャ オブジェクトなどを扱う正しい答えはおそらくありますが、最も簡単な方法は、洗練された入力から入力を取得し、, を . に置き換えてから、データベースに "money" または "decimal" 型として格納することです。 "。彼ら (おそらくユーザーごとに設定可能) が常にポーランド語または英語のいずれかで数値を入力していることがわかっている場合は、すべての入力数値を実行して、文字列を適切な「10 進数」型の変数に変換する関数を使用できます。また、表示目的で、別の同様の関数を実行して、ユーザーが常に快適な数値形式を確認できるようにすることもできます。ここで重要なのは、ユーザーから取得したらすぐに 10 進数に切り替え、ユーザーに送信する前の最後のステップでのみ文字列に戻すことです。

于 2008-08-21T13:24:54.857 に答える
0

どのデータベースを使用していますか? また、金額はどのデータ型に格納されますか?

ある形式から別の形式に常に変換している限り、解析を行う必要はなく、「.」を置き換えるだけです。「、」またはその逆。「£」記号が文字列に格納されている場合は、記号も削除する必要がある場合があります。

于 2008-08-21T13:07:07.413 に答える
0

@KiwiBastardはい、そう思います。金額を「(n)varchar」フィールドに保存していますか、それとも通貨/小数型フィールドを使用していますか? 後者の場合、通貨記号とセパレーターはクライアントによって追加され、データベース内の何かを置き換える必要はありません。

于 2008-08-21T13:30:21.553 に答える