Dynamic Date Validation with PopUp - java

I have a code to validate the date in the form of MMYY format.This shows dynamic popup dialog box before submitting the button. For this the code is given below as:
<ext:text name="caseDetailForm" property="phaseData.phaseDateExpiration" styleId="_dateExp"
style="width:100px" maxlength="4" titleKey="prompt.exp.date" onkeyup="validateCardExpiry(this);" />
and the function is:
function validateCardExpiry(field) {
var cardExpRegEx1or2char = /^(0[1-9]?|1[0-2]?)$/;
var cardExpRegEx3or4char = /^(0[1-9]?|1[0-2])[0-9]?[0-9]?$/;
var cardExpDate = field.value;
var msg = '<bean:message key="errors.bad.input.characters.detected"/> - '+cardExpDate;
+ '\n' + "<bean:message key="prompt.exp.date"/>";
var failed = false;
for (var x = cardExpDate.length; x >= 0; x--) {
cardExpDate = cardExpDate.substring(0, x);
if (cardExpDate.length > 0 &&
((cardExpDate.length <= 2 && !cardExpRegEx1or2char.test(cardExpDate))
|| (cardExpDate.length > 2 && !cardExpRegEx3or4char.test(cardExpDate)))) {
failed = true;
}
else {
field.value = cardExpDate;
break;
}
}
if (failed) {
alert(msg);
}
}
for MMYY validation is working fine with above code. But i need MM/DD/YYYY validation. For this how can i validate with popup window in the same scenario.

You can do something like:
function validateDate(s) {
var bits = s.split('/');
var d = new Date(bits[2], ++bits[0], bits[1]);
return d.getFullYear == bits[2] && d.getDate == bits[1];
}
but the format mm/dd/yyyy is not used by that many people, most use either dd/mm/yyyy or yyyy-mm-dd.

Related

How to paginate and sort with 2 combine query results

I have an user and he wants to display "order history" and "return order history" in customer details screen. "Order history" and "return order history" is from 2 tables of an other service. I merged 2 query results and it worked well on the first page.
According to my old way, I get "limit"(variable) first data in page "page"(variable) (If limit is 10, we will have 20 record. 10 with order, 10 with return order). Then I sort 2 query results by date. But it will have 10 records redundant and its will never appear in any page.
The code like this:
try {
data1 = orderClient.getOrderHistories(limit, page, id, null, null).getData();
data2 = orderClient.getOrderReturnHistories(id, page, limit).getData();
} catch (Exception ex) {
ex.printStackTrace();
}
assert data1 != null;
List<OrderDto> orderDto = data1.getItems();
assert data2 != null;
List<OrderReturnDto> orderReturnDto = data2.getItems();
List<OrderCombineDto> orderCombineDto = new ArrayList<>();
long totalOrder = data1.getMetadata().getTotal();
long totalReturn = data2.getMetadata().getTotal();
int indexOrder = 0;
int indexReturn = 0;
long listCombineSize =
limit.longValue() < (totalOrder + totalReturn) ? limit : (totalOrder + totalReturn);
for (int i = 0; i < listCombineSize; i++) {
OrderDto orders = indexOrder < totalOrder ? orderDto.get(indexOrder) : new OrderDto();
OrderReturnDto returns =
indexReturn < totalReturn ? orderReturnDto.get(indexReturn) : new OrderReturnDto();
if (orders.getFinalizedOn().after(returns.getReceiveDate())
&& !orders.getFinalizedOn().before(returns.getReceiveDate())
&& !(indexOrder >= totalOrder)) {
OrderCombineDto combineItem = ModelMappers.map(orders, OrderCombineDto.class);
orderCombineDto.add(combineItem);
indexOrder = indexOrder < totalOrder - 1 ? indexOrder + 1 : indexOrder;
} else if (!orders.getFinalizedOn().after(returns.getReceiveDate())
&& orders.getFinalizedOn().before(returns.getReceiveDate())
&& !(indexReturn >= totalReturn)) {
OrderCombineDto combineItem = ModelMappers.map(returns, OrderCombineDto.class);
orderCombineDto.add(combineItem);
indexReturn = indexReturn < totalReturn - 1 ? indexReturn + 1 : indexReturn;
}
}

How to return Int from ActionListener?

I created a little code with visual interface using JFrame... you can type in a date and hit the conformation button. The problem is that I can't return the values out of the ActionListener... cause its a void of cause, I also tried to declare the variables outside of the ActionListener, but I get an Error like not possible from inner function or so. Any Ideas?
Heres a part of my code and a screenshot:
DVDAddenButton.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
//((DefaultListModel)Liste.getModel()).addElement();
String Mediumtitel = DVDTextfeld.getText();
int DVDAusleihdatumZahlTag = 0;
int DVDAusleihdatumZahlMonat = 0;
int DVDAusleihdatumZahlJahr = 0;
String DVDAusleihdatumStringTag = "";
String DVDAusleihdatumStringMonat = "";
String DVDAusleihdatumStringJahr = "";
DVDAusleihdatumStringTag = DVDAusleihdatumFeldTag.getText();
DVDAusleihdatumStringMonat = DVDAusleihdatumFeldMonat.getText();
DVDAusleihdatumStringJahr = DVDAusleihdatumFeldJahr.getText();
try{
DVDAusleihdatumZahlTag = Integer.parseInt(DVDAusleihdatumStringTag);
DVDAusleihdatumZahlMonat = Integer.parseInt(DVDAusleihdatumStringMonat);
DVDAusleihdatumZahlJahr = Integer.parseInt(DVDAusleihdatumStringJahr);
}
catch(NumberFormatException ex){}
if (DVDAusleihdatumZahlTag < 32 && DVDAusleihdatumZahlTag > 0 && DVDAusleihdatumZahlMonat < 13 && DVDAusleihdatumZahlMonat > 0 && DVDAusleihdatumZahlJahr < date.getJahr()+1){
model.addElement(Mediumtitel);
model.addElement("Ausgeliehen am: " + DVDAusleihdatumZahlTag + "." + DVDAusleihdatumZahlMonat + "." + DVDAusleihdatumZahlJahr);
model.addElement(" ");
DatumFehler.setVisible(false);
}
else{
DatumFehler.setVisible(true);
}
}
});
enter image description here
Sorry for messed up code..
You can make a new class, then create the class inside ActionListener, then your class stores the information. When you want to access it, just call it from the class.

How to check if the string is equal to or greater than something?

I want to check if strCurrentSpeed is greater than or equal to "10".
how do i do that? i am getting error- "The operator >= is undefined for the argument type(s) String, int" i know this is pretty basic but i couldn't find a workaround
public void updateSpeed(CLocation location)
{
float nCurrentSpeed = 0;
if( location!=null )
{
location.setUseMetricUnits(this.useMetricUnits());
nCurrentSpeed = location.getSpeed();
}
Formatter fmt = new Formatter(new StringBuilder());
fmt.format(Locale.US, "%5.1f", nCurrentSpeed);
String strCurrentSpeed = fmt.toString();
strCurrentSpeed = strCurrentSpeed.replace(' ', '0');
String strUnits = "miles/hour";
if (this.useMetricUnits())
{
strUnits = "meters/second";
}
TextView txtCurrentSpeed = (TextView) this.findViewById(R.id.txtCurrentSpeed);
txtCurrentSpeed.setText(strCurrentSpeed + " " + strUnits);
if (strCurrentSpeed >= 10){
//do action
}}
Use Explicit Conversion :
if(Integer.parseInt(strCurrentSpeed) >=10)
{
// Do you stuff
}

Detecting if a character in a String is an emoticon (using Android)

Like the title says. I want to find out if a given java String contains an emoticon.
I can't use Character.UnicodeBlock.of(char) == Character.UnicodeBlock.EMOTICONS since that requires API level 19.
I found this code for iOS but it isn't really applicable since it looks like java and objective-c handle surrogate pairs in different manners.
The documentations I've looked through tell me that:
A char value, therefore, represents Basic Multilingual Plane (BMP) code points, including the surrogate code points, or code units of the UTF-16 encoding
I'm not quite sure what that means. Does that simply mean that they also include the BMP point as their first number?
According to Wikipedia the emoticon set lies between 0x1f600 and 0x1f64f but I don't know how to check if the char is in that range.
I had hoped that something like this would work but it didn't
if (0x1f600 <= a && a <= 0x1f64f)
{
Print.d("Unicode", "groovy!");
}
So how do I go about this?
Four years later...
At this time, it might make more sense to take advantage of EmojiCompat. This code presumes you initialized EmojiCompat when your app was starting up. The basic idea here is to have EmojiCompat process your CharSequence, inserting instances of EmojiSpan wherever any emoji appear, and then examine the results.
public static boolean containsEmoji(CharSequence charSequence) {
boolean result = false;
CharSequence processed = EmojiCompat.get().process(charSequence, 0, charSequence.length() -1, Integer.MAX_VALUE, EmojiCompat.REPLACE_STRATEGY_ALL);
if (processed instanceof Spannable) {
Spannable spannable = (Spannable) processed;
result = spannable.getSpans(0, spannable.length() - 1, EmojiSpan.class).length > 0;
}
return result;
}
If you want to collect a list of the unique emoji that appear within a given CharSequence, you could do something like this, iterating over the results of getSpans() and finding the start and end of each span to capture the emoji discovered by EmojiCompat:
#NonNull
public static List<String> getUniqueEmoji(CharSequence charSequence) {
Set<String> emojiList = new HashSet<>();
CharSequence processed = EmojiCompat.get().process(charSequence, 0, charSequence.length() -1, Integer.MAX_VALUE, EmojiCompat.REPLACE_STRATEGY_ALL);
if (processed instanceof Spannable) {
Spannable spannable = (Spannable) processed;
EmojiSpan[] emojiSpans = spannable.getSpans(0, spannable.length() - 1, EmojiSpan.class);
for (EmojiSpan emojiSpan : emojiSpans) {
int spanStart = spannable.getSpanStart(emojiSpan);
int spanEnd = spannable.getSpanEnd(emojiSpan);
CharSequence emojiCharSequence = spannable.subSequence(spanStart, spanEnd);
emojiList.add(String.valueOf(emojiCharSequence));
}
}
return emojiList.size() > 0 ? new ArrayList<>(emojiList) : new ArrayList<String>();
}
UPDATE: Here's an example of EmojiCompat initialization. This static method can be called from your Application onCreate() method, passing in the Application itself as the Context param.
#JvmStatic
fun initEmojiCompat(context: Context) {
if (emojiCompatConfig != null) {
// alternatively, EmojiCompat.reset() could be called here
logger().w(LOGTAG, "EmojiCompat already initialized.")
return
}
// "Noto Color Emoji Compat" doesn't have graphics for the following emojis:
// U+1F5E3 "speaking head" (required)
// U+1F441 "eye" (required)
// U+1F575 "detective" (nice to have)
val fontRequest = FontRequest(
"com.google.android.gms.fonts",
"com.google.android.gms",
"Noto Color Emoji Compat",
R.array.com_google_android_gms_fonts_certs
)
emojiCompatConfig = FontRequestEmojiCompatConfig(context, fontRequest)
.setReplaceAll(false)
.setEmojiSpanIndicatorEnabled(false)
.registerInitCallback(initCallback)
.also {
EmojiCompat.init(it)
}
}
I was in fact able to use the linked iOS code to create the following function. I didn't realize that a String that contains, for example, a single emoticon will have a length of 2. So you can check if a character is in fact a surrogate.
I'm not entirely sure how to handle else if (substring.length > 1) from the iOS code but I think Character.isHighSurrogate(myChar) does the same job in that instance.
private boolean containsIllegalCharacters(String displayName)
{
final int nameLength = displayName.length();
for (int i = 0; i < nameLength; i++)
{
final char hs = displayName.charAt(i);
if (0xd800 <= hs && hs <= 0xdbff)
{
final char ls = displayName.charAt(i + 1);
final int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f)
{
return true;
}
}
else if (Character.isHighSurrogate(hs))
{
final char ls = displayName.charAt(i + 1);
if (ls == 0x20e3)
{
return true;
}
}
else
{
// non surrogate
if (0x2100 <= hs && hs <= 0x27ff)
{
return true;
}
else if (0x2B05 <= hs && hs <= 0x2b07)
{
return true;
}
else if (0x2934 <= hs && hs <= 0x2935)
{
return true;
}
else if (0x3297 <= hs && hs <= 0x3299)
{
return true;
}
else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50)
{
return true;
}
}
}
return false;
}
This is how Telegram does it:
private static boolean isEmoji(String message){
return message.matches("(?:[\uD83C\uDF00-\uD83D\uDDFF]|[\uD83E\uDD00-\uD83E\uDDFF]|" +
"[\uD83D\uDE00-\uD83D\uDE4F]|[\uD83D\uDE80-\uD83D\uDEFF]|" +
"[\u2600-\u26FF]\uFE0F?|[\u2700-\u27BF]\uFE0F?|\u24C2\uFE0F?|" +
"[\uD83C\uDDE6-\uD83C\uDDFF]{1,2}|" +
"[\uD83C\uDD70\uD83C\uDD71\uD83C\uDD7E\uD83C\uDD7F\uD83C\uDD8E\uD83C\uDD91-\uD83C\uDD9A]\uFE0F?|" +
"[\u0023\u002A\u0030-\u0039]\uFE0F?\u20E3|[\u2194-\u2199\u21A9-\u21AA]\uFE0F?|[\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55]\uFE0F?|" +
"[\u2934\u2935]\uFE0F?|[\u3030\u303D]\uFE0F?|[\u3297\u3299]\uFE0F?|" +
"[\uD83C\uDE01\uD83C\uDE02\uD83C\uDE1A\uD83C\uDE2F\uD83C\uDE32-\uD83C\uDE3A\uD83C\uDE50\uD83C\uDE51]\uFE0F?|" +
"[\u203C\u2049]\uFE0F?|[\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE]\uFE0F?|" +
"[\u00A9\u00AE]\uFE0F?|[\u2122\u2139]\uFE0F?|\uD83C\uDC04\uFE0F?|\uD83C\uDCCF\uFE0F?|" +
"[\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA]\uFE0F?)+");
}
It is Line 21,026.
Try this...
if (Integer.parseInt("1f600", 16) <= (int)'☺' && (int)'☺' <= Integer.parseInt("1f64f", 16)) {
Print.d("Unicode", "groovy!");
}
This might work because the hexidecimal value and the char value are both being converted to ints.
Here's some Kotlin that relies on java.lang.Character api (granted the original poster can't use this). I have found it pretty reliably tells apart an emoji from 'special characters' and non-latin alphabets etc. Try it.
import java.lang.Character.*
import java.lang.Character.UnicodeBlock.MISCELLANEOUS_TECHNICAL
import java.lang.Character.UnicodeBlock.MISCELLANEOUS_SYMBOLS
import java.lang.Character.UnicodeBlock.VARIATION_SELECTORS
fun isStringEmoji(someString: String): Boolean {
if (someString.isNotEmpty() && someString.length < 5) {
val firstCodePoint = codePointAt(someString, 0)
val lastCodePoint = codePointBefore(someString, someString.length)
if (isValidCodePoint(firstCodePoint) && isValidCodePoint(lastCodePoint)) {
if (isSupplementaryCodePoint(firstCodePoint) ||
isSupplementaryCodePoint(lastCodePoint) ||
UnicodeBlock.of(firstCodePoint) == MISCELLANEOUS_SYMBOLS ||
UnicodeBlock.of(firstCodePoint) == MISCELLANEOUS_TECHNICAL ||
UnicodeBlock.of(lastCodePoint) == VARIATION_SELECTORS
) {
return true
}
}
}
return false
}

How to validate input value in a TextField in Java ME

I am writing a simple SRMS, and I need to validate the input from the user if it matches some criteria depending on the field, e.g. an email field or a phone field. The app is to run in a featured phone and so I am using the Java ME SDK with a virtual machine for testing.
What is the best way to do so, what would be the best way to validate the input and if the input does not meet some criteria, should the user be notified or the value she has entered to be set to null again.
public void name() {
boolean nameValid = false;
display = Display.getDisplay(this);
nameForm = new Form("Student Record Management (1/4");
TextField firstName = new TextField("First Name(s)", "", 20, TextField.ANY);
TextField lastName = new TextField("Last Name", "", 20, TextField.ANY);
TextField personNumber = new TextField("Person Number", "", 10, TextField.NUMERIC);
back = new Command("BACK", Command.BACK, 1);
next = new Command("Continue", Command.ITEM, 2);
nameForm.append(firstName);
nameForm.append(lastName);
nameForm.append(personNumber);
nameForm.addCommand(back);
nameForm.addCommand(next);
nameForm.setItemStateListener(this);
nameForm.setCommandListener(this);
display.setCurrent(nameForm);
if (firstName.toString().length() > 0) {
nameValid = true;
}
}
The person who started the code has implemented the CommandListener and ItestStateListener.
I am not sure what is the second one does and it has an abstract method to be filled which is called itemStateChanged(Item item) am I supposed to check for changes and validate in here ?
The ItemStateListener notifies the application of changes in Form items. The item itemStateChanged(Item item) method is called when an item in your form is changed by the user or when Item.notifyStateChanged() is called in an Item. The argument is the Item (Textfield, DateField, ect) that changed value.
I would recommend that you call your validation method inside both the CommandAction and ItemStateListener. In the itemStateChanged only the current Item (the one received in the argument) should be checked. In the CommandAction every field should be checked. This way every Item is validated in every situation.
public static boolean validateEmailID(String email) {
email = email.trim();
String reverse = new StringBuffer(email).reverse().toString();
if (email == null || email.length() == 0 || email.indexOf("#") == -1) {
return false;
}
int emailLength = email.length();
int atPosition = email.indexOf("#");
int atDot = reverse.indexOf(".");
String beforeAt = email.substring(0, atPosition);
String afterAt = email.substring(atPosition + 1, emailLength);
if (beforeAt.length() == 0 || afterAt.length() == 0) {
return false;
}
for (int i = 0; email.length() - 1 > i; i++) {
char i1 = email.charAt(i);
char i2 = email.charAt(i + 1);
if (i1 == '.' && i2 == '.') {
return false;
}
}
if (email.charAt(atPosition - 1) == '.' || email.charAt(0) == '.' || email.charAt(atPosition + 1) == '.' || afterAt.indexOf("#") != -1 || atDot < 2) {
return false;
}
return true;
}

Categories