0

我正在尝试将公司名称放在卡号前面,这里的代码是我试图让它在前面打印名称的代码。我在这里遇到的问题是每家公司都有规则 - 条件,我正在努力将这些规则变成 if 语句的条件。

我意识到我正在做的 if 语句不是处理这个问题的好方法,但我只是要求解释解决这个问题的最佳方法。

AMEX 卡规则: - 长度为 15 - 以“34”或“37”开头

发现卡规则: - 长度为 16 - 以“6011”开头

万事达卡规则: - 长度为 16 - 以“51”或“55”开头

VISA 卡规则: - 以“13”或“16”或“4”开头

我正在从代码中看到的另一个文件中读取数字,我认为我不必包含这个,但这就是为什么我遇到麻烦我不想跳过 if 语句只是说我的不切实际

这是我的代码:

import { createReadStream } from 'fs'
import { createInterface } from 'readline'

const lineReader = createInterface({
  input: createReadStream('data/input.txt')
})

lineReader.on('line', (creditCard: string) => {
  if ((creditCard.length === 15 && creditCard.substring(0, 1) === '37')) {
creditCard = '(AMEX) ' + creditCard + ' valid'
  } else {
return
  }
  console.log('Line from file: ', creditCard)
})
4

4 回答 4

1

这就是我正在寻找信用卡/借记卡类型的方法。但我确定你不能跳过 if 语句。

// declared all validators regex. 
var validators = {
      'american_express': /^3[47]/,
      'visa': /^4/,
      'mastercard': /^5[1-5]/,
      'discover': /^6011/,
      'amex_length': /^[0-9]{15}$/,
      'visa_length': /^[0-9]{16,16}$/,
      'cvv': /^[0-9]{3}$/,
      'amex_cvv': /^[0-9]{4}$/
};

// create a function to apply validations
function getCardType(cardNumber) {
     var result = "Unknown";
     if (validators.mastercard.test(cardNumber)) {
         result = "MasterCard";
     }else if (validators.visa.test(cardNumber)) {
         result = "Visa";
     }else if (validators.american_express.test(cardNumber)) {
         result = "Amex";
     }else if (validators.discover.test(cardNumber)) {
         result = "Discover";
     }
     return result;
}
于 2017-11-20T05:08:11.873 回答
0

我不确定我是否完全理解您的问题,但下面的代码是我能想到的解决上述问题的最简单方法。

它使用 if 语句。不知道为什么要避免它们。

    if(creditCard.substring(0, 1) === '13' || creditCard.substring(0, 1) === '16' || creditCard.substring(0, 1) === '4'){
      //Visa
    }else if(creditCard.length === 15){
      //AMEX
    }else if(creditCard.substring(0, 1) === '6011'){
      //Discover
    }else{
      //MasterCard
    }

如果您一开始看不到它,我基本上已经对 if 语句进行了排序,这样我就可以根据特定于它们的值来删除卡片。

然后我就不用担心比较那张卡或以后的价值了。

于 2017-11-20T05:01:12.760 回答
0

我也相信 if 语句在这里会非常好,但这是另一种编写方式,如果有大量信用卡类型并且您以后想要扩展卡类型集,这可能更适合。

它将每种卡类型转换为一个对象实例,并使用一个卡类型数组,当遇到卡号时搜索该数组。这样,确定卡片类型的逻辑实际上不需要知道可用的类型(如果这是设计目标)。

class CreditCardType {
  constructor (
    public name: string,
    public validateNumber: (creditCardNumber) => boolean) {
  }
}

const CARDS: CreditCardType[] = [
  new CreditCardType('AMEX',
    (creditCardNumber) =>
      creditCardNumber.length === 15 && creditCardNumber.substring(0, 1) === '37'),
  new CreditCardType('Visa',
    (creditCardNumber) =>
      creditCardNumber.substring(0, 2) == '13')
]

因此,任何时候您需要找出卡号的卡类型,您都可以这样做

function getCardType(creditCardNumber: string) {
    return CARDS.find(cardType => 
        cardType.validateNumber(creditCard)).name
)
于 2017-11-20T05:08:22.620 回答
0

我已经弄清楚了我的大部分问题,这将打印出符合美国运通规则的数字和附加的数字(美国运通)首先我声明了一个变量:company然后我修复了子字符串,从 添加creditCard.substring(0, 1) 到 然后调用我们之前声明的变量 确保包含反引号creditCard.substring(0, 2)|| creditCard.substring(0, 2) === 34companycompany = (AMEX) ${creditCard}(AMEX) ${creditCard}

这是完整的代码块:https : //imgur.com/krmhbYn(必须使用 imgur 不允许我使用反引号)

这是控制台输出:https ://imgur.com/j6oSN8R

于 2017-11-21T02:55:24.297 回答