diff --git a/Plugins/Wox.Plugin.Calculator/Main.cs b/Plugins/Wox.Plugin.Calculator/Main.cs index 9e7036e650..42f592b187 100644 --- a/Plugins/Wox.Plugin.Calculator/Main.cs +++ b/Plugins/Wox.Plugin.Calculator/Main.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Globalization; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows; @@ -20,6 +21,7 @@ namespace Wox.Plugin.Caculator private static Regex regBrackets = new Regex(@"[\(\)\[\]]", RegexOptions.Compiled); private static ParseContext yampContext; private PluginInitContext context { get; set; } + private NumberTranslator _numberTranslator; static Main() { @@ -36,34 +38,37 @@ namespace Wox.Plugin.Caculator try { - var result = yampContext.Run(query.Search); + var result = yampContext.Run(this._numberTranslator?.Translate(query.Search) ?? query.Search); if (result.Output != null && !string.IsNullOrEmpty(result.Result)) { + string resultValue = this._numberTranslator?.TranslateBack(result.Result) ?? result.Result; return new List - { new Result - { - Title = result.Result, - IcoPath = "Images/calculator.png", - Score = 300, - SubTitle = "Copy this number to the clipboard", - Action = c => + { + new Result { - try + Title = resultValue, + IcoPath = "Images/calculator.png", + Score = 300, + SubTitle = "Copy this number to the clipboard", + Action = c => { - Clipboard.SetText(result.Result); - return true; - } - catch (ExternalException e) - { - MessageBox.Show("Copy failed, please try later"); - return false; + try + { + Clipboard.SetText(resultValue); + return true; + } + catch (ExternalException e) + { + MessageBox.Show("Copy failed, please try later"); + return false; + } } } - } }; + }; } } catch - {} + { } return new List(); } @@ -90,6 +95,7 @@ namespace Wox.Plugin.Caculator public void Init(PluginInitContext context) { this.context = context; + this._numberTranslator = NumberTranslator.Create(CultureInfo.CurrentCulture, CultureInfo.InvariantCulture); } public string GetTranslatedPluginTitle() diff --git a/Plugins/Wox.Plugin.Calculator/NumberTranslator.cs b/Plugins/Wox.Plugin.Calculator/NumberTranslator.cs new file mode 100644 index 0000000000..448301d4fb --- /dev/null +++ b/Plugins/Wox.Plugin.Calculator/NumberTranslator.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Wox.Plugin.Caculator +{ + /// + /// Tries to convert all numbers in a text from one culture format to another. + /// + public class NumberTranslator + { + private readonly CultureInfo sourceCulture; + private readonly CultureInfo targetCulture; + private readonly Regex splitRegexForSource; + private readonly Regex splitRegexForTarget; + + private NumberTranslator(CultureInfo sourceCulture, CultureInfo targetCulture) + { + this.sourceCulture = sourceCulture; + this.targetCulture = targetCulture; + + this.splitRegexForSource = GetSplitRegex(this.sourceCulture); + this.splitRegexForTarget = GetSplitRegex(this.targetCulture); + } + + /// + /// Create a new - returns null if no number conversion + /// is required between the cultures. + /// + /// source culture + /// target culture + /// + public static NumberTranslator Create(CultureInfo sourceCulture, CultureInfo targetCulture) + { + bool conversionRequired = sourceCulture.NumberFormat.NumberDecimalSeparator != targetCulture.NumberFormat.NumberDecimalSeparator + || sourceCulture.NumberFormat.PercentGroupSeparator != targetCulture.NumberFormat.PercentGroupSeparator + || sourceCulture.NumberFormat.NumberGroupSizes != targetCulture.NumberFormat.NumberGroupSizes; + return conversionRequired + ? new NumberTranslator(sourceCulture, targetCulture) + : null; + } + + /// + /// Translate from source to target culture. + /// + /// + /// + public string Translate(string input) + { + return this.Translate(input, this.sourceCulture, this.targetCulture, this.splitRegexForSource); + } + + /// + /// Translate from target to source culture. + /// + /// + /// + public string TranslateBack(string input) + { + return this.Translate(input, this.targetCulture, this.sourceCulture, this.splitRegexForTarget); + } + + private string Translate(string input, CultureInfo cultureFrom, CultureInfo cultureTo, Regex splitRegex) + { + var outputBuilder = new StringBuilder(); + + string[] tokens = splitRegex.Split(input); + foreach (string token in tokens) + { + decimal number; + outputBuilder.Append( + decimal.TryParse(token, NumberStyles.Number, cultureFrom, out number) + ? number.ToString(cultureTo) + : token); + } + + return outputBuilder.ToString(); + } + + private Regex GetSplitRegex(CultureInfo culture) + { + var splitPattern = $"((?:\\d|{Regex.Escape(culture.NumberFormat.NumberDecimalSeparator)}"; + if (!string.IsNullOrEmpty(culture.NumberFormat.NumberGroupSeparator)) + { + splitPattern += $"|{Regex.Escape(culture.NumberFormat.NumberGroupSeparator)}"; + } + splitPattern += ")+)"; + return new Regex(splitPattern); + } + } +} diff --git a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj index 7d9aefe604..c65590ea74 100644 --- a/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj +++ b/Plugins/Wox.Plugin.Calculator/Wox.Plugin.Calculator.csproj @@ -51,6 +51,7 @@ Properties\SolutionAssemblyInfo.cs +