Changeset 13050 in josm


Ignore:
Timestamp:
2017-10-29T14:57:41+01:00 (7 years ago)
Author:
Don-vip
Message:

fix #14602 - allow both dot and comma decimal separator everywhere possible for user-entered values

Location:
trunk/src/org/openstreetmap/josm
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java

    r13047 r13050  
    3939import org.openstreetmap.josm.tools.GBC;
    4040import org.openstreetmap.josm.tools.ImageProvider;
     41import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
    4142import org.openstreetmap.josm.tools.Logging;
    4243
     
    263264            if (layer != null && semicolon >= 0 && semicolon + 1 < ostr.length()) {
    264265                try {
    265                     // here we assume that Double.parseDouble() needs '.' as a decimal separator
    266                     String easting = ostr.substring(0, semicolon).trim().replace(',', '.');
    267                     String northing = ostr.substring(semicolon + 1).trim().replace(',', '.');
    268                     double dx = Double.parseDouble(easting);
    269                     double dy = Double.parseDouble(northing);
     266                    String easting = ostr.substring(0, semicolon).trim();
     267                    String northing = ostr.substring(semicolon + 1).trim();
     268                    double dx = JosmDecimalFormatSymbolsProvider.parseDouble(easting);
     269                    double dy = JosmDecimalFormatSymbolsProvider.parseDouble(northing);
    270270                    tempOffset.setDisplacement(new EastNorth(dx, dy));
    271271                    layer.getDisplaySettings().setOffsetBookmark(tempOffset);
  • trunk/src/org/openstreetmap/josm/gui/DownloadParamType.java

    r12633 r13050  
    7878         * Download area specified on the command line as bounds string.
    7979         * @param rawGps Flag to download raw GPS tracks
    80          * @param s The bounds parameter
     80         * @param s The bounds parameter. Coordinates must use dot decimal separator as comma is used to delimit values
    8181         * @return the complete download task (including post-download handler), or {@code null}
    8282         */
  • trunk/src/org/openstreetmap/josm/gui/dialogs/LatLonDialog.java

    r12938 r13050  
    358358    /**
    359359     * Parses a east/north coordinate string
    360      * @param s The coordinates
     360     * @param s The coordinates. Dot has to be used as decimal separator, as comma can be used to delimit values
    361361     * @return The east/north coordinates or <code>null</code> on error.
    362362     */
  • trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java

    r12735 r13050  
    3030import org.openstreetmap.josm.gui.widgets.JosmTextField;
    3131import org.openstreetmap.josm.tools.GBC;
     32import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
     33import org.openstreetmap.josm.tools.Logging;
    3234import org.openstreetmap.josm.tools.OsmUrlToBounds;
    3335
     
    140142        for (int i = 0; i < 4; i++) {
    141143            try {
    142                 values[i] = Double.parseDouble(latlon[i].getText());
     144                values[i] = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[i].getText());
    143145            } catch (NumberFormatException ex) {
    144146                return null;
     
    199201            double value = 0;
    200202            try {
    201                 value = Double.parseDouble(tfLatValue.getText());
     203                value = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatValue.getText());
    202204            } catch (NumberFormatException ex) {
    203205                setErrorMessage(tfLatValue, tr("The string ''{0}'' is not a valid double value.", tfLatValue.getText()));
     
    232234            double value = 0;
    233235            try {
    234                 value = Double.parseDouble(tfLonValue.getText());
     236                value = JosmDecimalFormatSymbolsProvider.parseDouble(tfLonValue.getText());
    235237            } catch (NumberFormatException ex) {
    236238                setErrorMessage(tfLonValue, tr("The string ''{0}'' is not a valid double value.", tfLonValue.getText()));
     
    289291            double minlon, minlat, maxlon, maxlat;
    290292            try {
    291                 minlat = Double.parseDouble(latlon[0].getText().trim());
    292                 minlon = Double.parseDouble(latlon[1].getText().trim());
    293                 maxlat = Double.parseDouble(latlon[2].getText().trim());
    294                 maxlon = Double.parseDouble(latlon[3].getText().trim());
     293                minlat = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[0].getText().trim());
     294                minlon = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[1].getText().trim());
     295                maxlat = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[2].getText().trim());
     296                maxlon = JosmDecimalFormatSymbolsProvider.parseDouble(latlon[3].getText().trim());
    295297            } catch (NumberFormatException e) {
     298                Logging.trace(e);
    296299                return null;
    297300            }
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/Offset.java

    r11971 r13050  
    99import java.util.concurrent.TimeUnit;
    1010
     11import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
    1112import org.openstreetmap.josm.tools.Pair;
    1213
     
    5859                    offset = offset.substring(1);
    5960                }
    60                 return Offset.milliseconds(Math.round(Double.parseDouble(offset) * 1000));
     61                return Offset.milliseconds(Math.round(JosmDecimalFormatSymbolsProvider.parseDouble(offset) * 1000));
    6162            } catch (NumberFormatException nfe) {
    6263                throw (ParseException) new ParseException(error, 0).initCause(nfe);
  • trunk/src/org/openstreetmap/josm/gui/mappaint/RenderingCLI.java

    r13021 r13050  
    2121import org.openstreetmap.gui.jmapviewer.OsmMercator;
    2222import org.openstreetmap.josm.CLIModule;
    23 import org.openstreetmap.josm.tools.I18n;
    2423import org.openstreetmap.josm.Main;
    2524import org.openstreetmap.josm.data.Bounds;
     
    3736import org.openstreetmap.josm.spi.preferences.Config;
    3837import org.openstreetmap.josm.spi.preferences.MemoryPreferences;
     38import org.openstreetmap.josm.tools.I18n;
     39import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
    3940import org.openstreetmap.josm.tools.Logging;
    4041import org.openstreetmap.josm.tools.RightAndLefthandTraffic;
     
    263264                case SCALE:
    264265                    try {
    265                         argScale = Double.parseDouble(getopt.getOptarg());
     266                        argScale = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
    266267                    } catch (NumberFormatException nfe) {
    267268                        throw new IllegalArgumentException(
     
    285286                case WIDTH_M:
    286287                    try {
    287                         argWidthM = Double.parseDouble(getopt.getOptarg());
     288                        argWidthM = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
    288289                    } catch (NumberFormatException nfe) {
    289290                        throw new IllegalArgumentException(
     
    295296                case HEIGHT_M:
    296297                    try {
    297                         argHeightM = Double.parseDouble(getopt.getOptarg());
     298                        argHeightM = JosmDecimalFormatSymbolsProvider.parseDouble(getopt.getOptarg());
    298299                    } catch (NumberFormatException nfe) {
    299300                        throw new IllegalArgumentException(
  • trunk/src/org/openstreetmap/josm/gui/preferences/DefaultPreferenceSetting.java

    r12460 r13050  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.preferences;
     3
     4import javax.swing.JCheckBox;
     5import javax.swing.JTextField;
     6
     7import org.openstreetmap.josm.spi.preferences.Config;
     8import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
     9import org.openstreetmap.josm.tools.Logging;
    310
    411/**
    512 * Abstract base class for {@link PreferenceSetting} implementations.
    613 *
    7  * Handles the flag that indicates if a PreferenceSetting is and expert option
    8  * or not.
     14 * Handles the flag that indicates if a PreferenceSetting is and expert option or not.
     15 * @since 4968
    916 */
    1017public abstract class DefaultPreferenceSetting implements PreferenceSetting {
     
    3441        return isExpert;
    3542    }
     43
     44    /**
     45     * Saves state from a {@link JCheckBox} to a boolean preference.
     46     * @param prefName preference name
     47     * @param cb check box
     48     * @since 13050
     49     */
     50    protected static void saveBoolean(String prefName, JCheckBox cb) {
     51        Config.getPref().putBoolean(prefName, cb.isSelected());
     52    }
     53
     54    /**
     55     * Saves text from a {@link JTextField} to a double preference.
     56     * @param prefName preference name
     57     * @param tf text field
     58     * @since 13050
     59     */
     60    protected static void saveDouble(String prefName, JTextField tf) {
     61        String text = tf.getText();
     62        try {
     63            Config.getPref().putDouble(prefName, JosmDecimalFormatSymbolsProvider.parseDouble(text));
     64        } catch (NumberFormatException e) {
     65            Logging.warn("Unable to save '" + text + "' as a double value for preference " + prefName);
     66            Logging.trace(e);
     67        }
     68    }
     69
     70    /**
     71     * Saves text from a {@link JTextField} to an integer preference.
     72     * @param prefName preference name
     73     * @param tf text field
     74     * @since 13050
     75     */
     76    protected static void saveInt(String prefName, JTextField tf) {
     77        String text = tf.getText();
     78        try {
     79            Config.getPref().putInt(prefName, Integer.parseInt(text));
     80        } catch (NumberFormatException e) {
     81            Logging.warn("Unable to save '" + text + "' as an integer value for preference " + prefName);
     82            Logging.trace(e);
     83        }
     84    }
    3685}
  • trunk/src/org/openstreetmap/josm/gui/preferences/audio/AudioPreference.java

    r12846 r13050  
    134134    public boolean ok() {
    135135        Config.getPref().putBoolean("audio.menuinvisible", !audioMenuVisible.isSelected());
    136         Config.getPref().putBoolean("marker.traceaudio", markerAudioTraceVisible.isSelected());
    137         Config.getPref().putBoolean("marker.buttonlabels", markerButtonLabels.isSelected());
    138         Config.getPref().putBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints.isSelected());
    139         Config.getPref().putBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints.isSelected());
    140         Config.getPref().putBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints.isSelected());
    141         Config.getPref().putBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps.isSelected());
    142         Config.getPref().putBoolean("marker.audiofromstart", audioMarkersFromStart.isSelected());
    143         Config.getPref().put("audio.forwardbackamount", audioForwardBackAmount.getText());
    144         Config.getPref().put("audio.fastfwdmultiplier", audioFastForwardMultiplier.getText());
    145         Config.getPref().put("audio.leadin", audioLeadIn.getText());
    146         Config.getPref().put("audio.calibration", audioCalibration.getText());
     136        saveBoolean("marker.traceaudio", markerAudioTraceVisible);
     137        saveBoolean("marker.buttonlabels", markerButtonLabels);
     138        saveBoolean("marker.audiofromexplicitwaypoints", audioMarkersFromExplicitWaypoints);
     139        saveBoolean("marker.audiofromuntimedwaypoints", audioMarkersFromUntimedWaypoints);
     140        saveBoolean("marker.audiofromnamedtrackpoints", audioMarkersFromNamedTrackpoints);
     141        saveBoolean("marker.audiofromwavtimestamps", audioMarkersFromWavTimestamps);
     142        saveBoolean("marker.audiofromstart", audioMarkersFromStart);
     143        saveDouble("audio.forwardbackamount", audioForwardBackAmount);
     144        saveDouble("audio.fastfwdmultiplier", audioFastForwardMultiplier);
     145        saveDouble("audio.leadin", audioLeadIn);
     146        saveDouble("audio.calibration", audioCalibration);
    147147        return false;
    148148    }
  • trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java

    r12735 r13050  
    2020import org.openstreetmap.josm.data.coor.conversion.DecimalDegreesCoordinateFormat;
    2121import org.openstreetmap.josm.tools.GBC;
     22import org.openstreetmap.josm.tools.JosmDecimalFormatSymbolsProvider;
     23import org.openstreetmap.josm.tools.Logging;
    2224import org.openstreetmap.josm.tools.OsmUrlToBounds;
    2325
     
    99101        double minlon, minlat, maxlon, maxlat;
    100102        try {
    101             minlat = Double.parseDouble(tfLatLon[0].getText().trim());
    102             minlon = Double.parseDouble(tfLatLon[1].getText().trim());
    103             maxlat = Double.parseDouble(tfLatLon[2].getText().trim());
    104             maxlon = Double.parseDouble(tfLatLon[3].getText().trim());
     103            minlat = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[0].getText().trim());
     104            minlon = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[1].getText().trim());
     105            maxlat = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[2].getText().trim());
     106            maxlon = JosmDecimalFormatSymbolsProvider.parseDouble(tfLatLon[3].getText().trim());
    105107        } catch (NumberFormatException e) {
     108            Logging.trace(e);
    106109            return null;
    107110        }
    108111        if (!LatLon.isValidLon(minlon) || !LatLon.isValidLon(maxlon)
    109                 || !LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat))
     112         || !LatLon.isValidLat(minlat) || !LatLon.isValidLat(maxlat))
    110113            return null;
    111114        if (minlon > maxlon)
     
    145148            double value = 0;
    146149            try {
    147                 value = Double.parseDouble(getComponent().getText());
     150                value = JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText());
    148151            } catch (NumberFormatException ex) {
    149152                feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
     153                Logging.trace(ex);
    150154                return;
    151155            }
     
    160164        public boolean isValid() {
    161165            try {
    162                 return LatLon.isValidLat(Double.parseDouble(getComponent().getText()));
    163             } catch (NumberFormatException ex) {
     166                return LatLon.isValidLat(JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText()));
     167            } catch (NumberFormatException ex) {
     168                Logging.trace(ex);
    164169                return false;
    165170            }
     
    181186            double value = 0;
    182187            try {
    183                 value = Double.parseDouble(getComponent().getText());
     188                value = JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText());
    184189            } catch (NumberFormatException ex) {
    185190                feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
     191                Logging.trace(ex);
    186192                return;
    187193            }
     
    196202        public boolean isValid() {
    197203            try {
    198                 return LatLon.isValidLon(Double.parseDouble(getComponent().getText()));
    199             } catch (NumberFormatException ex) {
     204                return LatLon.isValidLon(JosmDecimalFormatSymbolsProvider.parseDouble(getComponent().getText()));
     205            } catch (NumberFormatException ex) {
     206                Logging.trace(ex);
    200207                return false;
    201208            }
  • trunk/src/org/openstreetmap/josm/tools/JosmDecimalFormatSymbolsProvider.java

    r12931 r13050  
    22package org.openstreetmap.josm.tools;
    33
     4import java.text.DecimalFormat;
    45import java.text.DecimalFormatSymbols;
     6import java.text.NumberFormat;
    57import java.text.spi.DecimalFormatSymbolsProvider;
    68import java.util.Locale;
     
    2830        return I18n.getAvailableTranslations();
    2931    }
     32
     33    /**
     34     * Returns a new {@code double} initialized to the value represented by the specified {@code String},
     35     * allowing both dot and comma decimal separators.
     36     *
     37     * @param  s   the string to be parsed.
     38     * @return the {@code double} value represented by the string argument.
     39     * @throws NullPointerException  if the string is null
     40     * @throws NumberFormatException if the string does not contain a parsable {@code double}.
     41     * @see    Double#parseDouble(String)
     42     * @since 13050
     43     */
     44    public static double parseDouble(String s) throws NumberFormatException {
     45        String text = s;
     46        NumberFormat format = DecimalFormat.getInstance();
     47        if (format instanceof DecimalFormat) {
     48            char decimalSeparator = ((DecimalFormat) format).getDecimalFormatSymbols().getDecimalSeparator();
     49            text = text.replace('.', decimalSeparator).replace(',', decimalSeparator);
     50        }
     51        return Double.parseDouble(text);
     52    }
    3053}
Note: See TracChangeset for help on using the changeset viewer.