You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@click.apache.org by Carlos Lobato <lo...@gmail.com> on 2012/01/03 23:49:56 UTC

NumberField validation

Hi apache click folks,

I have been trying to make my app take a NumberField only if 5 digits are
input. With controls like TelephoneField all I have to do is set its
minimum length to whatever I want it to and the app will display an error
if minLength or maxLength aren't met. However, NumberField seems to ignore
minimum length, even though the documentation states that there are error
messages mapped for NumberFields for min or max length errors. I would like
to know if there is an appropriate NumberFormat that will force this field
to 5 digits, so far I've used setPattern("#"), setPattern("#####"),
setPattern("00000"), setPattern("12345"); all to the same results; and I
would also like to know what is the proper way to override its validation
and do my own thing, because that seems to be another way to accomplish
custom validations, right now this field is only validated when it gets no
input (setRequired).

Thanks and happy 2012,

Re: NumberField validation

Posted by Carlos Lobato <lo...@gmail.com>.
Hi Arne, I'm not sure this class is compliant with best practices, but here
it is:

public class LengthNumberField extends NumberField {

    private static final long serialVersionUID = 1L;

    public LengthNumberField(String name) {
        super(name);
        setAttribute("onkeypress", "javascript:return
doubleFilter(event);");
        setTextAlign("right");
    }

    /**
     * Construct a LengthNumberField with the given name and label.
     *
     * @param name the name of the field
     * @param label the label of the field
     */
    public LengthNumberField(String name, String label) {
        super(name, label);
        setAttribute("onkeypress", "javascript:return
doubleFilter(event);");
        setTextAlign("right");
    }

    /**
     * Construct a LengthNumberField with the given name and required
status.
     *
     * @param name the name of the field
     * @param required the field required status
     */
    public LengthNumberField(String name, boolean required) {
        this(name);
        setRequired(required);
    }

    /**
     * Construct a LengthNumberField with the given name, label and
required status.
     *
     * @param name the name of the field
     * @param label the label of the field
     * @param required the field required status
     */
    public LengthNumberField(String name, String label, boolean required) {
        this(name, label);
        setRequired(required);
    }

    /**
     * Construct the LengthNumberField with the given name, label and size.
     *
     * @param name the name of the field
     * @param label the label of the field
     * @param size the size of the field
     */
    public LengthNumberField(String name, String label, int size) {
        this(name, label);
        setSize(size);
    }

    /**
     * Construct the LengthNumberField with the given name, label, size and
     * required status.
     *
     * @param name the name of the field
     * @param label the label of the field
     * @param size the size of the field
     * @param required the field required status
     */
    public LengthNumberField(String name, String label, int size, boolean
required) {
        this(name, label, required);
        setSize(size);
    }

    /**
     * Create a LengthNumberField with no name defined.
     * <p/>
     * <b>Please note</b> the control's name must be defined before it is
valid.
     */
    public LengthNumberField() {
        setAttribute("onkeypress", "javascript:return
doubleFilter(event);");
        setTextAlign("right");
    }

    /**
     * Validate the LengthNumberField request submission.
     * <p/>
     * A field error message is displayed if a validation error occurs.
     * These messages are defined in the resource bundle: <blockquote>
     * <pre>org.apache.click.control.MessageProperties</pre></blockquote>
     * <p/>
     * Error message bundle key names include: <blockquote><ul>
     * <li>field-maxlength-error</li>
     * <li>field-minlength-error</li>
     * <li>field-required-error</li>
     * </ul></blockquote>
     */
    @Override
    public void validate() {
        setError(null);

        String value = getValue();

        int length = value.length();
        if (length > 0) {
            if (getMinLength() > 0 && length < getMinLength()) {
                setErrorMessage("field-minlength-error", getMinLength());
                return;
            } else {
                try {
                    NumberFormat format = getNumberFormat();
                    Number number = format.parse(value);

                    double doubleValue = number.doubleValue();

                    if (doubleValue > maxvalue) {
                        setErrorMessage("number-maxvalue-error",
                                getNumberFormat().format(maxvalue));

                    } else if (doubleValue < minvalue) {
                        setErrorMessage("number-minvalue-error",
                                getNumberFormat().format(minvalue));

                    } else {
                        String formattedValue = format.format(number);
                        setValue(formattedValue);
                    }

                } catch (ParseException pe) {
                    setError(getMessage("number-format-error",
getErrorLabel()));
                }
            }

            if (getMaxLength() > 0 && length > getMaxLength()) {
                setErrorMessage("field-maxlength-error", getMaxLength());
                return;
            } else {
                try {
                    NumberFormat format = getNumberFormat();
                    Number number = format.parse(value);

                    double doubleValue = number.doubleValue();

                    if (doubleValue > maxvalue) {
                        setErrorMessage("number-maxvalue-error",
                                getNumberFormat().format(maxvalue));

                    } else if (doubleValue < minvalue) {
                        setErrorMessage("number-minvalue-error",
                                getNumberFormat().format(minvalue));

                    } else {
                        String formattedValue = format.format(number);
                        setValue(formattedValue);
                    }

                } catch (ParseException pe) {
                    setError(getMessage("number-format-error",
getErrorLabel()));
                }
            }

        } else {
            if (isRequired()) {
                setErrorMessage("field-required-error");
            }
        }
    }
}

Best,
-Carlos



On Thu, Jan 5, 2012 at 2:18 AM, <Ar...@dlr.de> wrote:

>  Hi Carlos,****
>
> ** **
>
> I would be very much interested in the code!****
>
> Best regards,****
>
> ** **
>
> Arne****
>
> ** **
>
> ** **
>
> *Von:* Carlos Lobato [mailto:lobato87@gmail.com]
> *Gesendet:* Mittwoch, 4. Januar 2012 19:18
> *An:* user@click.apache.org
> *Betreff:* Re: NumberField validation****
>
> ** **
>
> Hi,
>
> Upon comparing the validate method of NumberField, which subclasses
> TextField, I realized NumberField's validate overrides TextField's; so I
> ended up subclassing NumberField to "LengthNumberField" and merging NF and
> TF validate methods in it. In the end, LengthNumberField validates max, min
> value and max, min length. If any of you guys want to implement it you can
> reply and I'll send you the code (:
>
> Thanks to Bob and everybody else for devoting so much of your time in
> answering questions.
>
> Regards,
> -Carlos****
>
> ** **
>
> On Tue, Jan 3, 2012 at 11:38 PM, Bob Schellink <sa...@gmail.com> wrote:**
> **
>
> Hi,****
>
>
> On Wed, Jan 4, 2012 at 12:49 AM, Carlos Lobato <lo...@gmail.com> wrote:
> > Hi apache click folks,
> >
> > I have been trying to make my app take a NumberField only if 5 digits are
> > input. With controls like TelephoneField all I have to do is set its
> minimum
> > length to whatever I want it to and the app will display an error if
> > minLength or maxLength aren't met. However, NumberField seems to ignore
> > minimum length, even though the documentation states that there are error
> > messages mapped for NumberFields for min or max length errors.****
>
> NumberField support min and max value, but not min and max length. So
> you can do:
>
> field.setMaxValue(99);****
>
>
>
> > would also like to know what is the proper way to override its validation
> > and do my own thing, because that seems to be another way to accomplish
> > custom validations, right now this field is only validated when it gets
> no
> > input (setRequired).****
>
> You can override the validate() method to do your own validation.
>
> regards
>
> Bob****
>
> ** **
>

AW: NumberField validation

Posted by Ar...@dlr.de.
Hi Carlos,

I would be very much interested in the code!
Best regards,

Arne


Von: Carlos Lobato [mailto:lobato87@gmail.com]
Gesendet: Mittwoch, 4. Januar 2012 19:18
An: user@click.apache.org
Betreff: Re: NumberField validation

Hi,

Upon comparing the validate method of NumberField, which subclasses TextField, I realized NumberField's validate overrides TextField's; so I ended up subclassing NumberField to "LengthNumberField" and merging NF and TF validate methods in it. In the end, LengthNumberField validates max, min value and max, min length. If any of you guys want to implement it you can reply and I'll send you the code (:

Thanks to Bob and everybody else for devoting so much of your time in answering questions.

Regards,
-Carlos

On Tue, Jan 3, 2012 at 11:38 PM, Bob Schellink <sa...@gmail.com>> wrote:
Hi,

On Wed, Jan 4, 2012 at 12:49 AM, Carlos Lobato <lo...@gmail.com>> wrote:
> Hi apache click folks,
>
> I have been trying to make my app take a NumberField only if 5 digits are
> input. With controls like TelephoneField all I have to do is set its minimum
> length to whatever I want it to and the app will display an error if
> minLength or maxLength aren't met. However, NumberField seems to ignore
> minimum length, even though the documentation states that there are error
> messages mapped for NumberFields for min or max length errors.
NumberField support min and max value, but not min and max length. So
you can do:

field.setMaxValue(99);


> would also like to know what is the proper way to override its validation
> and do my own thing, because that seems to be another way to accomplish
> custom validations, right now this field is only validated when it gets no
> input (setRequired).
You can override the validate() method to do your own validation.

regards

Bob


Re: NumberField validation

Posted by Carlos Lobato <lo...@gmail.com>.
Hi,

Upon comparing the validate method of NumberField, which subclasses
TextField, I realized NumberField's validate overrides TextField's; so I
ended up subclassing NumberField to "LengthNumberField" and merging NF and
TF validate methods in it. In the end, LengthNumberField validates max, min
value and max, min length. If any of you guys want to implement it you can
reply and I'll send you the code (:

Thanks to Bob and everybody else for devoting so much of your time in
answering questions.

Regards,
-Carlos

On Tue, Jan 3, 2012 at 11:38 PM, Bob Schellink <sa...@gmail.com> wrote:

> Hi,
>
> On Wed, Jan 4, 2012 at 12:49 AM, Carlos Lobato <lo...@gmail.com> wrote:
> > Hi apache click folks,
> >
> > I have been trying to make my app take a NumberField only if 5 digits are
> > input. With controls like TelephoneField all I have to do is set its
> minimum
> > length to whatever I want it to and the app will display an error if
> > minLength or maxLength aren't met. However, NumberField seems to ignore
> > minimum length, even though the documentation states that there are error
> > messages mapped for NumberFields for min or max length errors.
>
> NumberField support min and max value, but not min and max length. So
> you can do:
>
> field.setMaxValue(99);
>
>
> > would also like to know what is the proper way to override its validation
> > and do my own thing, because that seems to be another way to accomplish
> > custom validations, right now this field is only validated when it gets
> no
> > input (setRequired).
>
> You can override the validate() method to do your own validation.
>
> regards
>
> Bob
>

Re: NumberField validation

Posted by Bob Schellink <sa...@gmail.com>.
Hi,

On Wed, Jan 4, 2012 at 12:49 AM, Carlos Lobato <lo...@gmail.com> wrote:
> Hi apache click folks,
>
> I have been trying to make my app take a NumberField only if 5 digits are
> input. With controls like TelephoneField all I have to do is set its minimum
> length to whatever I want it to and the app will display an error if
> minLength or maxLength aren't met. However, NumberField seems to ignore
> minimum length, even though the documentation states that there are error
> messages mapped for NumberFields for min or max length errors.

NumberField support min and max value, but not min and max length. So
you can do:

field.setMaxValue(99);


> would also like to know what is the proper way to override its validation
> and do my own thing, because that seems to be another way to accomplish
> custom validations, right now this field is only validated when it gets no
> input (setRequired).

You can override the validate() method to do your own validation.

regards

Bob