All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vaadin.data.converter.AbstractStringToNumberConverter Maven / Gradle / Ivy

There is a newer version: 8.27.3
Show newest version
/*
 * Copyright (C) 2000-2024 Vaadin Ltd
 *
 * This program is available under Vaadin Commercial License and Service Terms.
 *
 * See  for the full
 * license.
 */

package com.vaadin.data.converter;

import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.Locale;

import com.vaadin.data.Converter;
import com.vaadin.data.ErrorMessageProvider;
import com.vaadin.data.Result;
import com.vaadin.data.ValueContext;

/**
 * A converter that converts from the number type T to {@link String} and back.
 * Uses the given locale and {@link NumberFormat} for formatting and parsing.
 * Automatically trims the input string, removing any leading and trailing white
 * space.
 * 

* Override and overwrite {@link #getFormat(Locale)} to use a different format. *

* * @author Vaadin Ltd * @since 8.0 */ public abstract class AbstractStringToNumberConverter implements Converter { private final ErrorMessageProvider errorMessageProvider; private T emptyValue; /** * Creates a new converter instance with the given empty string value and * error message provider. * * @param emptyValue * the presentation value to return when converting an empty * string, may be null * @param errorMessageProvider * the error message provider to use if conversion fails * * @since 8.4 */ protected AbstractStringToNumberConverter(T emptyValue, ErrorMessageProvider errorMessageProvider) { this.emptyValue = emptyValue; this.errorMessageProvider = errorMessageProvider; } /** * Creates a new converter instance with the given empty string value and * error message. * * @param emptyValue * the presentation value to return when converting an empty * string, may be null * @param errorMessage * the error message to use if conversion fails */ protected AbstractStringToNumberConverter(T emptyValue, String errorMessage) { this(emptyValue, ctx -> errorMessage); } /** * Returns the format used by * {@link #convertToPresentation(Object, ValueContext)} and * {@link #convertToModel(Object, ValueContext)}. * * @param locale * The locale to use * @return A NumberFormat instance */ protected NumberFormat getFormat(Locale locale) { if (locale == null) { locale = Locale.getDefault(); } return NumberFormat.getNumberInstance(locale); } /** * Convert the value to a Number using the given locale and * {@link #getFormat(Locale)}. * * @param value * The value to convert * @param context * The value context for conversion * @return The converted value */ protected Result convertToNumber(String value, ValueContext context) { if (value == null) { return Result.ok(null); } // Remove leading and trailing white space value = value.trim(); // Parse and detect errors. If the full string was not used, it is // an error. ParsePosition parsePosition = new ParsePosition(0); Number parsedValue = getFormat(context.getLocale().orElse(null)) .parse(value, parsePosition); if (parsePosition.getIndex() != value.length()) { return Result.error(getErrorMessage(context)); } if (parsedValue == null) { // Convert "" to the empty value return Result.ok(emptyValue); } return Result.ok(parsedValue); } /** * Gets the error message to use when conversion fails. * * @return the error message */ protected String getErrorMessage(ValueContext context) { return errorMessageProvider.apply(context); } @Override public String convertToPresentation(T value, ValueContext context) { if (value == null) { return null; } return getFormat(context.getLocale().orElse(null)).format(value); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy