2

私が取り組んでいるアプリケーションは、多くの国でリリースされ、その言語をサポートする必要があります。私は自分のコードに戻って、次のすべてのインスタンスを置き換えてきました:

QString::number()QString().toDouble()

QLocale().toString()QLocale().toDouble()

2 つのクラスをオンラインで比較したものはあまり見つかりませんでしたが、後者を使用した場合の影響に興味がありQStringます。

基本的に、これらすべての変更を行う前に、コードに害を与えていないことを確認したいだけです。どなたか知識のある方はいらっしゃいませんか?

4

1 に答える 1

7

メソッドはQStringロケールに依存しません: 常にCロケールで発生します。これは、I/O がローカライズされていない場合に役立ちます。たとえば、データ ファイルがロケール間で移植可能である必要がある場合や、機械で読み取り可能である必要がある場合です。

メソッドのすべての使用をQString、ローカライズされたQLocale! どの用途をローカライズする必要があるかを判断する必要があります。通常、これらには UI と、プロジェクト仕様で数値 I/O をローカライズする必要があると記載されているテキスト ファイル I/O が含まれます。仕様にそれが記載されていない場合は、最初に仕様を修正し、ユーザー向けのドキュメントにもその動作を文書化することをお勧めします。

テキスト I/O には、次の考慮事項が適用されます。

  1. 受け入れるものには寛容になり、アウトプットするものには保守的になりましょう。

  2. PDF や HTML レポート ファイルなど、人間が消費するための出力であり、データ抽出のために機械で読み取り可能にすることを意図していない出力には、ローカライズされた数字を使用する必要があります。

  3. CSV ファイルや XML ファイルなど、マシンで使用するための出力では、C ロケールを使用する必要があります。

  4. テキスト入力では、目的の入力ロケールを選択できるようにする必要があり、寛容である必要があります。たとえば、CSV を使用する場合、入力に対してQString::toDoubleQLocale::toDouble直接使用するのではなく、最初に入力を前処理してロケールを検出し、固定の C ロケールに変換してから、それを にフィードしQString::toDoubleます。例えば

    QPair<double, bool> toDouble(QString in) {
      auto dots = in.count('.');
      auto commas = in.count(',');
      if ((dots > 1 && commas > 1) || (dots == 1 && commas ==1))
        // equivocal input
        return qMakePair(0.0, false);
      if (dots > 1 && commas <=1) {
        // dots are group separators
        in.replace(".", "");
        in.replace(',', '.');
      }
      else if (dots <= 1 && commas > 1) {
        // commas are group separators
        in.replace(",", "");
      }
      else if (commas == 1) {
        // assume commas are decimal points
        in.replace(',', '.');
      }
      bool ok;
      auto dbl = in.toDouble(&ok);
      return qMakePair(dbl, ok);
    }
    

    実際のコードでは、すべての数値を単独ではなくセットとして調べ、グループ区切り記号と小数点の明確な選択を検出できることを確認する必要があります。そうしないと、入力を拒否する必要があります。

于 2016-06-28T21:04:48.067 に答える