7
<![CDATA[
    var $ = jQuery;
    String locale = getUserLocale();
    $(document).ready(function() {

        if (!isEmptyNull(locale) && locale.equals("zh_CN")) {
            $("input[id*='text12']").mask('9999年99月99日');
        }
        else {
            $("input[id*='text12']").mask('99/99/9999');
        }
    });
]]>

<p:calendar id="text12" styleClass="calendar" maxlength="10" pattern="#
{pc_Test.dateDisplayFormat}"></p:calendar>

If the locale is equal to 'zh_CN', the masking would be '9999年99月99日'. Otherwise, it would would be '99/99/9999'.
When I remove the if else command, it works. But if I put the if else command inside, it doesn't work.

How do I solve it?

Kukeltje
  • 12,223
  • 4
  • 24
  • 47
binbin
  • 73
  • 1
  • 1
  • 5

5 Answers5

27

Check out the below code..

<input
    type="text"
    name="date"
    placeholder="dd/mm/yyyy"
    onkeyup="
        var v = this.value;
        if (v.match(/^\d{2}$/) !== null) {
            this.value = v + '/';
        } else if (v.match(/^\d{2}\/\d{2}$/) !== null) {
            this.value = v + '/';
        }"
    maxlength="10"
>

<input
    type="text"
    name="date"
    placeholder="mm/dd/yyyy"
    onkeyup="
        var v = this.value;
        if (v.match(/^\d{2}$/) !== null) {
            this.value = v + '/';
        } else if (v.match(/^\d{2}\/\d{2}$/) !== null) {
            this.value = v + '/';
        }"
    maxlength="10"
>
<input
    type="text"
    name="date"
    placeholder="yyyy/mm/dd"
    onkeyup="
        var v = this.value;
        if (v.match(/^\d{4}$/) !== null) {
            this.value = v + '/';
        } else if (v.match(/^\d{4}\/\d{2}$/) !== null) {
            this.value = v + '/';
        }"
    maxlength="10"
>
<input
    type="text"
    name="date"
    placeholder="yyyy年mm月dd"
    onkeyup="
        var v = this.value;
        if (v.match(/^\d{4}$/) !== null) {
            this.value = v + '年';
        } else if (v.match(/^\d{4}年\d{2}$/) !== null) {
            this.value = v + '月';
        }"
    maxlength="10"
>

Hope this is what you are looking for!

Pratik Shah
  • 788
  • 5
  • 8
  • Thanks for ur answer! But what I want is to mask the date format according to the different locale. For example, if my locale equals to en_US, the mask will be display 99/99/9999 which is __/__/____ But if my locale equals to zh_CN, the mask will be display ____ 年__月__日 Any ideas for this? Thanks – binbin Jun 29 '15 at 07:23
  • Hi @binbin! In your case I guess you have to detect the location of the user and than change the "/" with local language! In cases like RTF reading you just need to change the order of the if and else if conditions. – Pratik Shah Jun 29 '15 at 09:21
  • Hi @Pratik Shah, Thanks for ur examples. Let me try the code to see whether it work for me. – binbin Jun 29 '15 at 09:45
  • HI @Pratik Shah It doesn't work. Can you give me some suggestion or examples that do the masking in the javascript like what I did above? Thanks! – binbin Jun 29 '15 at 09:55
  • Can you show me which part of code is not working for you? So that I can help you with it? and it would be better if you can give me jsFiddle or something showcasing your desired output. – Pratik Shah Jun 29 '15 at 10:10
  • When my locale equals to zh_CN, the mask doesn't change to 9999年99月99日. Can you show me some examples of using mask instead of onkeyup?Thanks :) – binbin Jun 30 '15 at 03:01
  • That's awesome. I added some few validations for Brazil's time and also the delete and backspace keys. – Jorge Campos May 03 '18 at 18:30
  • its take 78 on day option its should be less than 12 right? how to add the conditions? – Selva Ganapathi Dec 18 '19 at 10:46
  • 1
    Hi @SelvaGanapathi, suggested solution is only for the length of the input and not for the value validation. – Pratik Shah Dec 20 '19 at 10:24
  • Not a good solution because a user could try string instead of an integer. Must restrict only for integer – asela daskon Nov 06 '20 at 07:59
3

I had some trouble getting the currently accepted answers to work properly while retaining the ability to backspace. This was my solution. It retains backspacing and also doesn't show the slash until the number following it is typed.

const maskDate = value => {
  let v = value.replace(/\D/g,'').slice(0, 10);
  if (v.length >= 5) {
    return `${v.slice(0,2)}/${v.slice(2,4)}/${v.slice(4)}`;
  }
  else if (v.length >= 3) {
    return `${v.slice(0,2)}/${v.slice(2)}`;
  }
  return v
}

I've also create a github gist for this snippet here.

Chris Patty
  • 189
  • 1
  • 3
  • 12
  • Nice and clean. Though this only works if the user always enters 2-digit months and days. Handling 1-digit day/month gets trickier (like 1/1/1970). – Tom Pietrosanti Nov 10 '20 at 22:01
2

I have solved this issue a simple function(without regular expressions and only for the format 'dd/mm/yyyy'). And the important thing is that My function pays attention to the maximum values of the date(31) and month(12). For example, You can not input 32/11/2000 or 20/13/2000.

function maskForDate(value) {
    if (value.length > 10) {
        return value.substring(0, 10);
    }

    switch (value.length) {
        case 1: 
            if (value > 3) {
                value = "3";
            }
            break;
        case 2: 
            if (value > 31) {
                value = "31";
            }
            break;
        case 3:
        case 4:
            if (value[2] !== "/") {
                value = value.substr(0, 2) + "/" + value[2];
            }
            if (value[3] > 1) {
                value = value.substr(0, 3) + "1";
            }
            break;
        case 5: 
            if (value.substr(3, 2) > 12) {
                value = value.substr(0, 3) + "12";
            }
            break;
        case 6:
        case 7:
            if (value[5] !== "/") {
                value = value.substr(0, 5) + "/" + value[5];
            }
            if (value[6] < 1) {
                value = value.substr(0, 6) + "1";
            }
            break;
        default: 
            break;
    }

    return value;
}
-1

Try out this code, this will format your date in mm/dd/yyyy format as you type it in the input box. Create an onchange event on the input box and call the date_formator function with the input date.

function date_formator(date) {

    date = date.replace('//', '/');
    var result = date.split("/");

    var length = result.length;

    // Append "/" after the last two charas, if more than 2 charas then remove it
    if (length <= 2 && result[length - 1] != "") {
        var last_two_digits = result[length -1];
        if (last_two_digits.length >= 2) {
            date = date.slice(0, -last_two_digits.length);
            date = date + last_two_digits.slice(0,2) + "/";
        }
    }

    if (typeof result[2] != "undefined") {
        var year = result[2];
        if (year.length > 4) {
            date = date.slice(0, -year.length);
            year = year.slice(0, 4);
            date = date + year;
        }
    }
    return date;
}
Shubham Najardhane
  • 386
  • 1
  • 4
  • 12
-4

This works quite well (tried it in console on the jquery mask page)

 if (locale !=='' && locale==='zh_CN') {
          $('#text12').mask('9999年99月99日');
          }
          else {
          $('#text12').mask('99/99/9999');
          }

but if you want the mask format to show up in the input field you need to pass it as placeholder attribute

$('#text12').attr('placeholder', '9999年99月99日')

hope this helps

AbeCodes
  • 109
  • 1
  • 5
  • Hi @AbeCodes, Thanks for your answer. But it doesn't work for me :( For the placeholder, I'm using watermark and it's work well. Just that the mask can't show up. – binbin Jun 30 '15 at 01:56
  • @binbin try a timeout, maybe the input isnt rendered at this point, the code works fine ;) or maybe there is a problem with watermark? – AbeCodes Jun 30 '15 at 03:52
  • I tried and i guess the problem is the if else command because when I remove the if else command, it works well. I think there is a problem with locale and i don't know why they can't get the locale properly :( – binbin Jun 30 '15 at 03:58
  • go with var locale and check via if (locale !=='' && locale==='zh_CN'). and check with console.log(locale) if a value is set. – AbeCodes Jun 30 '15 at 04:51
  • you get a value for locale? – AbeCodes Jun 30 '15 at 06:16
  • No. There is nothing come out. – binbin Jun 30 '15 at 07:04
  • you need to fix the function and then it should work ;) – AbeCodes Jun 30 '15 at 07:44
  • I found out that there is the problem with locale. There is "Uncaught ReferenceError: getUserLocale is not defined". Do you know how to call the locale in javascript? – binbin Jun 30 '15 at 07:50
  • this error tells you that the function is not defined. i dont know your code or site. if the locale is passed via cookie you can read the cookie value. or if you pass it via body class attribute you can read this. – AbeCodes Jun 30 '15 at 07:58
  • Thanks. I will check it out :) – binbin Jun 30 '15 at 08:23
  • Have fun ;) Tell me if it works and dont forget to upvote if it does ;) – AbeCodes Jun 30 '15 at 08:24