india_format_utils 0.0.1
india_format_utils: ^0.0.1 copied to clipboard
Indian format utilities for Flutter: PAN number validation and INR currency formatting with Lakhs & Crores.
import 'package:flutter/material.dart';
import 'package:india_format_utils/india_format_utils.dart';
void main() {
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: ValidationDemoPage(),
);
}
}
class ValidationDemoPage extends StatefulWidget {
const ValidationDemoPage({super.key});
@override
State<ValidationDemoPage> createState() => _ValidationDemoPageState();
}
class _ValidationDemoPageState extends State<ValidationDemoPage> {
final _panController = TextEditingController();
final _amountController = TextEditingController();
final _phoneController = TextEditingController();
bool? _panValid;
bool? _phoneValid;
String _formattedInr = '';
String _phoneError = '';
@override
void dispose() {
_panController.dispose();
_amountController.dispose();
_phoneController.dispose();
super.dispose();
}
void _validatePan(String value) {
setState(() {
_panValid = PanValidator.isValid(
value.trim(),
validateHolderType: true,
);
});
}
void _formatInr(String value) {
setState(() {
final parsed = num.tryParse(value);
_formattedInr =
parsed == null ? 'Invalid amount' : InrFormatter.format(parsed);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('india_format_utils Example'),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// PAN
const Text(
'PAN Number',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextField(
controller: _panController,
textCapitalization: TextCapitalization.characters,
onChanged: _validatePan,
decoration: InputDecoration(
hintText: 'ABCDE1234F',
suffixIcon: _panValid == null
? null
: Icon(
_panValid! ? Icons.check_circle : Icons.error,
color: _panValid! ? Colors.green : Colors.red,
),
),
),
const SizedBox(height: 24),
// INR
const Text(
'Amount (INR)',
style: TextStyle(fontWeight: FontWeight.bold),
),
TextField(
controller: _amountController,
keyboardType: TextInputType.number,
onChanged: _formatInr,
decoration: const InputDecoration(
hintText: 'Enter amount',
),
),
const SizedBox(height: 8),
Text(
_formattedInr.isEmpty ? '' : 'Formatted: $_formattedInr',
style: const TextStyle(fontSize: 16),
),
],
),
),
);
}
}