Дважды. Синтаксический анализ - проблема Интернационализации

Избегание JSX и использование React.createElement решает эту проблему.

declare namespace Props {
  interface Fruit {
    price: number;
  }

  interface Banana extends Fruit {
    curvature: number;
  }
}

declare const Fruit: React.FC<Props.Fruit>;
declare const Banana: React.FC<Props.Banana>;

// ✅ 
const one: React.ReactComponentElement<typeof Fruit> = React.createElement(
  Fruit,
  { price: 1000 }
);

// ✅
const two: React.ReactComponentElement<typeof Banana> = React.createElement(
  Banana,
  { price: 1000, curvature: 12 }
);

/**
 * ✅ Compile-time error.
 * Type 'FunctionComponentElement<Banana>' is not assignable to type
 * 'ReactComponentElement<FunctionComponent<Fruit>, Pick<PropsWithChildren<Fruit>, "price" | "children">>'.
 * ...
 * fruits.tsx(10, 5): 'curvature' is declared here.
 */
const three: React.ReactComponentElement<typeof Fruit> = React.createElement(
  Banana
);

/**
 * ✅ Compile-time error.
 * Type 'FunctionComponentElement<Fruit>' is not assignable to type
 * 'ReactComponentElement<FunctionComponent<Banana>,
 * ...
 * Types of property 'propTypes' are incompatible.          
18
задан Jason Punyon 6 April 2009 в 15:27
поделиться

6 ответов

Это берет культуру, которую Вы дали и применение корректного форматирования. Вы обеспечили строку "0,009" и сказали ей, что это было испанским... затем, Вы жалуетесь, что она правильно интерпретировала его как испанский язык! Не говорите этому, что строка является испанской, когда Вы знаете, что это не.

Необходимо передать метод Синтаксического анализа культура проанализированной строки, который в этом случае был бы en-США или en-Гбитом или InvariantCulture.

20
ответ дан 30 November 2019 в 07:09
поделиться

У Вас есть он назад.

Когда Вы говорите double d = Double.Parse(s, new CultureInfo("es-ES"));, Вы просите, чтобы.NET проанализировала Вашу строку в двойное, предположив, что строка записана в культуре es-ES.

В испанской культуре, "." тысячи разделителя, таким образом, "0.009" 9.

При преобразовании использования ToString (), в конце, это говорит, преобразовывают 0.009 в строку с помощью испанской культуры, таким образом, это использует"" как десятичный разделитель, и Вы добираетесь "0,009". Поведение корректно.

Мое предположение - то, что Вы хотите использовать Дважды. Синтаксический анализ с Инвариантной Культурой и ToString с испанской культурой, таким образом, 0.009 становится 0,009.

4
ответ дан 30 November 2019 в 07:09
поделиться

Вы путаете парсинг и форматирование. Вы добираетесь 9 вместо.009 в первый раз, потому что Вы берете строку, которая форматирована в культуре на основе., и проанализируйте ее с помощью a, - базирующаяся культура. Необходимо проанализировать его с помощью любой культуры, с которой это было создано, и затем отформатируйте его с помощью любой культуры, которую Вы хотите для дисплея.

2
ответ дан 30 November 2019 в 07:09
поделиться

Я думаю, что Вы интерпретируете его, неправильным путем вокруг, в культуре es-ES 0.009 является действительно просто длинный путь сказать 9 как "." не десятичный разделитель, поэтому если Вы просите строку "0.009" быть проанализированными с культурой es-ES, необходимо действительно получить deouble 9.0. Если Вы просите, чтобы это проанализировало "0,009", необходимо получить двойной из 0,009.

Точно так же, если Вы просите, чтобы это отформатировало двойные 0.009, необходимо получить строку "0,009" в es-ES.

3
ответ дан 30 November 2019 в 07:09
поделиться
double d = Double.Parse("0,009",
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands,
    CultureInfo.CreateSpecificCulture("es-ES"));

В культуре es-ES"", десятичное число seporator (нет")

1
ответ дан 30 November 2019 в 07:09
поделиться

то, что пишет Джесс, мне нравится. только для тех, кому нужно опробовать, как получить "инвариантную культуру": это выглядит так

double d = Double.Parse (myString, CultureInfo.InvariantCulture);

(первая запись stackoverflow, так что да, скорее маргинальный;)

10
ответ дан 30 November 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: