我正在尝试将公司名称放在卡号前面,这里的代码就是我试图让它在前面打印出来的名字。我在这里遇到的问题是每家公司都有规则 - 条件,我正努力将这些规则纳入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)
})
答案 0 :(得分: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;
}
答案 1 :(得分: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语句,以便根据特定于它们的值去除卡片。
然后我不需要担心比较那张卡或那个值。
答案 2 :(得分: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
)
答案 3 :(得分:0)
我在很大程度上已经找到了我的问题,这将打印数字和AMEX规则下的数字(AMEX)
首先,我声明了一个变量:company
然后我修复了子字符串
creditCard.substring(0, 1)
至
creditCard.substring(0, 2)
在|| creditCard.substring(0, 2) === 34
中添加
然后调用我们之前声明的变量company
company = (AMEX) ${creditCard}
确保将(AMEX) ${creditCard}
包裹在后面的标记中
以下是完整的代码块:https://imgur.com/krmhbYn(必须使用imgur,不允许我使用反向代码代码)
这是控制台输出:https://imgur.com/j6oSN8R