Регулярное выражение для десятичного числа

Ваши элементы управления увеличением / уменьшением обернуты абсолютно позиционированным элементом с left:0 (из-за класса .leaflet-left), поэтому float:left не поможет, вы можете выровнять его вправо, переопределив left:0 на right:0, или изменение класса .leaflet-left на .leaflet-right

Но более правильным способом было бы использование предоставленного API.

//disable zoomControl when initializing map (which is topleft by default)
var map = L.map("map", {
    zoomControl: false
    //... other options
});

//add zoom control with your options
L.control.zoom({
     position:'topright'
}).addTo(map);

см. Обновленный fiddle

Описание API для используемой вами библиотеки можно найти здесь

31
задан gotqn 25 March 2015 в 15:05
поделиться

5 ответов

^[0-9]([.,][0-9]{1,3})?$

Это позволяет:

0
1
1.2
1.02
1.003
1.030
1,2
1,23
1,234

НО:

.1
,1
12.1
12,1
1.
1,
1.2345
1,2345
55
ответ дан 27 November 2019 в 21:39
поделиться

Существует альтернативный подход, который не имеет проблем I18n (допускает ',' или '.', Но не оба сразу): Decimal.TryParse .

Just попробуйте преобразовать, игнорируя значение.

bool IsDecimalFormat(string input) {
  Decimal dummy;
  return Decimal.TryParse(input, out dummy);
}

Это значительно быстрее, чем использование регулярного выражения, см. ниже.

(Перегрузка Decimal.TryParse может использоваться для более точного управления.)


Результаты теста производительности: Decimal.TryParse: 0,10277 мс, Regex: 0,49143 мс

Код ( PerformanceHelper.Run - помощник, который запускает делегат для количества пройденных итераций и возвращает среднее значение TimeSpan ].):

using System;
using System.Text.RegularExpressions;
using DotNetUtils.Diagnostics;

class Program {
    static private readonly string[] TestData = new string[] {
        "10.0",
        "10,0",
        "0.1",
        ".1",
        "Snafu",
        new string('x', 10000),
        new string('2', 10000),
        new string('0', 10000)
    };

    static void Main(string[] args) {
        Action parser = () => {
            int n = TestData.Length;
            int count = 0;
            for (int i = 0; i < n; ++i) {
                decimal dummy;
                count += Decimal.TryParse(TestData[i], out dummy) ? 1 : 0;
            }
        };
        Regex decimalRegex = new Regex(@"^[0-9]([\.\,][0-9]{1,3})?$");
        Action regex = () => {
            int n = TestData.Length;
            int count = 0;
            for (int i = 0; i < n; ++i) {
                count += decimalRegex.IsMatch(TestData[i]) ? 1 : 0;
            }
        };

        var paserTotal = 0.0;
        var regexTotal = 0.0;
        var runCount = 10;
        for (int run = 1; run <= runCount; ++run) {
            var parserTime = PerformanceHelper.Run(10000, parser);
            var regexTime = PerformanceHelper.Run(10000, regex);

            Console.WriteLine("Run #{2}: Decimal.TryParse: {0}ms, Regex: {1}ms",
                              parserTime.TotalMilliseconds, 
                              regexTime.TotalMilliseconds,
                              run);
            paserTotal += parserTime.TotalMilliseconds;
            regexTotal += regexTime.TotalMilliseconds;
        }

        Console.WriteLine("Overall averages: Decimal.TryParse: {0}ms, Regex: {1}ms",
                          paserTotal/runCount,
                          regexTotal/runCount);
    }
}
20
ответ дан 27 November 2019 в 21:39
поделиться
\d{1}(\.\d{1,3})?

Match a single digit 0..9 «\d{1}»
   Exactly 1 times «{1}»
Match the regular expression below and capture its match into backreference number 1 «(\.\d{1,3})?»
   Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
   Match the character “.” literally «\.»
   Match a single digit 0..9 «\d{1,3}»
      Between one and 3 times, as many times as possible, giving back as needed (greedy) «{1,3}»


Created with RegexBuddy

Соответствует:
1
1,2
1,23
1.234

8
ответ дан 27 November 2019 в 21:39
поделиться

Я только что нашел TryParse () имеет проблему, что он учитывает разделитель тысяч. Пример для En-US, 10,36.00 - это нормально. У меня был конкретный сценарий, в котором не следует рассматривать разделитель тысяч, и поэтому регулярное выражение \ d (\. \ D) оказалось лучшим выбором. Конечно, для разных языков пришлось сохранить переменную decimal char.

1
ответ дан 27 November 2019 в 21:39
поделиться

Пока я боролся с этим, TryParse в 3.5 действительно имеет NumberStyles: следующий код также должен делать трюк без Regex, чтобы игнорировать разделитель тысяч.

double.TryParse(length, NumberStyles.AllowDecimalPoint,CultureInfo.CurrentUICulture, out lengthD))

Не актуально на исходный вопрос, но подтверждая, что TryParse () действительно является хорошим вариантом.

0
ответ дан 27 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

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